Notification, Delegation

도윤·2022년 12월 19일
0

iOS

목록 보기
11/11

결합(coupling)없이 Controller사이에 동작을 전달하는 방법은 iOS에서 총 3가지 방법이 있습니다.
1. Delegation
2. Notification
3. Key Value observing

Delegation

delegation의 기본 개념은 Controller의 이벤트에 응답하여 위임자를 정의하는 protocol을 정의해야 한다.

일종의 기능 명세로, 이러한 Delegation의 역할을 하기 위해 protocol에 정의된 메서드나 프로퍼티들을 모두 구현해야 한다.

이렇게 protocol로 정의하게 되면서 어떠한 Controller에 결합되어 있지 않지만, Controller의 동작을 전달할 수 있다.

장점

  • 매우 엄격한 문법으로, 프토토콜에 필요한 메소드들이 명확하게 명시되어야 한다.
  • 컴파일 시 경고나 에러가 발생하여 구현하지 않은 메소드들을 알려준다.
  • 프로토콜이 컨트롤러 범위 내에서 정의된다.
  • 추적하기 쉽고 앱 내에서 흐름을 파악하기 쉽다.
  • 하나의 Controller가 여러개의 Delegate를 가질 수 있다.
  • 동작 흐름을 유지하거나 관찰하기 위한 써드파티 객체(NotificationCenter)가 필요가 없다

단점

  • 정의되어야 할 코드가 많다. 프로토콜 정의, Controller내에서 프토토콜에 정의된 메서드나 프로퍼티 구현
  • delegate 설정에 nil이 들어가지 않게 주의해야함. 크래시를 일으킬 수 있음.
  • 하나의 Delegation으로 많은 객체들에게 이벤트를 알려주는 것이 어렵고 비효율적임.(가능은 하지만)

Notification

NotificationCenter라는 싱글턴 객체를 통해 이벤트를 전달한다.
NotificationName을 통해 Controller에서 발생하는 이벤트들을 특정 객체들에게 전달하는 방식이다. Controller에게는 알려지지 않았지만 같은 키로 observer해놓은 객체들은 이를 전달 받는다.

장점

  • 구현하기 쉽고 코드가 매우 간단
  • 다수의 객체들에게 하나의 Notification으로 이벤트를 전달할 수 있음.
  • Notification과 관련된 특정 정보(userInfo)와 같은 문맥(Context)를 전달할 수 있음.

단점

  • 추적하기 쉽지 않다.
  • 써드파티 객체가 Controller와 object사이에 연결을 관리한다.
  • Notification이 Post된 이후에 어떠한 정보도 받을 수 없다.
  • key 값으로 Notification의 이름과 userInfo를 서로 맞추기 때문에 컴파일 시 구독이 잘 되고 있는지, 올바르게 userInfo의 value를 받아오는지 체크가 불가능함.

공통점

Delegation, Notification 모두 어떤 이벤트를 다른 화면에 전달하는 기능을 가진다.
Delegate패턴은 다른 객체의 인스턴스를 내부적으로 보유하여 그 인스턴스에서 활용하는 방식으로 운용되고, Notification은 어떤 객체를 Observing하여 그 객체의 변화에 따라 Observer들이 이벤트를 받아 처리할 수 있는 방식으로 운용된다.

차이점

Delegate는 수신자가 발신자의 정보를 알아야 한다.
즉, Controller가 Delegate변수를 가지고 있어야 하며 해당 프로토콜에 정의된 메서드들을 구현해야 한다.

Notificaiton은 단순히 Observe하여 이벤트가 발생한다면 어디에서 발송되는지 모르는 Post의 이벤트를 받는다.

Notificaiton을 사용하게 되면 어디서 발생된 이벤트를 가져오는지 확인하기 힘들어서 유지보수가 힘들다.

https://neph3779.github.io/ios/DelegateVsNotification/
https://shinesolutions.com/2011/06/14/delegation-notification-and-observation/

0개의 댓글