iOS. 객체 간의 데이터 통신 방법

sanghee·2021년 12월 17일
0
post-thumbnail

매주 진행하는 면접스터디에서 아래의 질문들에 대한 정리를 모은 글입니다.
Interview_Question_for_Beginner/iOS
Delegate vs Block vs Notification vs KVO

📌1. Delegate

객체 간의 통신을 할 경우 전달자 역할을 한다.

특정 객체에서 발생한 이벤트를 다른 객체에게 통보할 수 있도록 한다.

커뮤니케이션 과정을 유지하고 모니터링하는 제 3의 객체(ex: Notification Center)가 필요 없다.

📌Protocol

보통 Protocol을 정의하여 사용한다. Protocol이란 일종의 기능 명세서로, 지정된 객체가 가져야 하는 메소드들의 원형을 적는다.

Delegate 역할을 하는 객체는 이 Protocol을 따르며, 해당 메소드들을 구현한다.

컴파일 시 경고나 에러가 뜨므로 이후 객체에서 프로토콜의 구현되지 않은 메소드를 확인하기 쉽다.

2. Block

Completion block 을 사용한다.

이벤트가 딱 하나일 때 사용하기 좋다.

@escaping closure가 있다.

📌3. Notification

다수의 객체들에게 동시에 이벤트 발생을 알려줄 수 있다. 이벤트에 대해 여러 리스터가 있을 때 사용한다. 브로드캐스팅 방법이다.

Notification Center라는 싱글턴 객체를 통해 이벤트들의 발생 여부를 옵저버를 등록한 객체들에게 Notification을 post한다.

단점

key 값으로 Notification의 이름과 userInfo를 서로 맞추기 때문에 컴파일 시 구독이 잘 되고 있는지, 올바르게 userInfo의 value를 받아오는지 체크가 불가능하다.

추적이 쉽지 않다.

4. Key Value Observing(KVO)

KVO는 A 객체에서 B 객체의 프로퍼티가 변화됨을 감지할 수 있는 패턴이다. didSet이나 WillSet이 그 예시이다.

new value와 old value를 쉽게 얻을 수 있다.

정리

Delegate는 프로토콜로 정의되어 있어 코드가 읽기가 쉽고 추적이 쉽다. 웬만해서는 Delegate를 사용하자.

그러나 여러 객체들이 동시에 어떤 이벤트를 받아, 그것을 모두 반영해야 하는 경우는 Notification이 적절할 것이다. 예를 들어, 로그인 상태가 변하여 많은 뷰들을 업데이트해야 하는 경우가 있다.

profile
👩‍💻

0개의 댓글