앞서 3개의 post에서 KVO, Delegate, Notification에 대해서 알아보았다. 

 

실제로 Applicatoin에서, 객체간의 interaction이 필요한 경우가 많다. 

하지만 interaction을 위해 객체간의 종속되는 것"재사용성", "독립적인 기능요소"로의 가치를 잃게 된다!

예시로, ViewController는 특정 View를 관리하는 것이 아닌, 다른 ViewController에 종속되어 동작하는 것은 독립적인 기능요소의 가치를 잃게 된다. 

 

이러한 interaction을 위해 excessive coupling(과도한 결합) = 종속 없이 event를 전달 및 처리 하기 위해 3가지 pattern을 사용한다.

 

이번 포스트에서 이 3가지 방법에 대해 각각 어떤 장단점이 있는지 알아보고자 한다.

 

 

 

 

KVO

한 객체의 property의 변화를 다른 객체에서 확인할 수 있는 패턴이다. 

 

장점 

  • 두 객체간의 정보를 동기화하기에 적합하다.
  • 이전의 property value도 얻을 수 있다. 
  • keyPath를 통해, 계층화된 객체의 property에 접근할 수 있다.

 

단점

  • keyPath가 잘못되도 compile error가 나지 않는다
  • re-factoring하면 동작하지 않을 수 있다.
  • 많은 value를 감지하기 위해선 if문이 많이 필요함 
  • deallocate시에 observer를 지워줘야 한다.

 

 

 

Delegation

Delegatoin은 protocol에 청사진과 같이 구현해야할 method들의 원형만 지정하고,

Delegate로 지정된 객체protocol의 원형만 있는 moethod들을 구현을 한다.

이렇게 객체가 연결이 되면 event발생시 delegate에 지정된 객체에 전달한다.

 

장점

  • 엄격한 Syntax로 구현해야할 method가 protocol에 명확히 명시되어있다.
  • delegate로 지정된 객체에서 protocol의 method를 구현하지 않으면 Compile Error가 난다.
  • Logic의 흐름을 추적하기 쉽다.
  • 하나의 controller에 여러 protocol 및 delegate가 존재가능하다.
  • Communication을 위해 제 3의 객체가 필요 없다.

단점

  • 코드가 길어진다. (protocol definition, protocol implementation .. )
  • delegate에 nil이 들어가면 memory crash 발생할 수 있다.
  • 여러 객체에 하나의 이벤트를 알리기엔 적합하지 않다. 

 

 

Notification

NotificationCenter라는 싱글톤제 3의 객체로 발신하는 객체와 송신하는 객체가 이어진다. 

발신하는 객체는 post를 통해 NotificationCenterevent를 등록하고 

송신하는 객체는 observer를 추가해 NotificationCenter로 부터 event를 broadcast방식으로 받게 된다.

 

장점

  • 구현에 많은 라인의 코드가 필요하지 않다. 
  • Broadcast방식이기 때문에 여러 객체에 한 이벤트를 전달하기 적절하다.
  • userInfo를 통해 custom information을 post할 수 있다.

단점

  • key(name)값으로 Notification을 식별하는 과정이 runtime에 일어나기 때문에, compile시 잘 연결되어 있는지, userInfo의 information들을 잘 가져오는지 확인이 불가능하다.
  • 발신자는 event가 post된 후에 observer로 부터 information을 다시 가져올 수 없다. 
  • 두 객체간의 communication 하기 위해 제 3의 객체가 필요하다.
  • 발신하는 객체가 메모리에서 해제된 경우NotificationCenter가 싱글톤이기 때문에 따로 등록된 Observer들을 해제해 주는 작업이 필요하다. 

 

 

Reference

'iOS > Swift' 카테고리의 다른 글

[Swift] Initializer(2) - Class Initializer의 상속  (0) 2022.11.10
[Swift] Initializer(1)  (0) 2022.11.09
[Swift] Notification  (0) 2022.10.08
[Swift] Delegate  (0) 2022.10.07
[Swift] KVO (Key-Value-Observing)  (0) 2022.10.06
복사했습니다!