iOS/iOS

Delegate,Block,Notification,KVO

황민우 2022. 2. 28. 16:11

정의

- 해당 패턴들은 대부분 View와 ViewController 간 소통이 필요할 때 사용하는 패턴입니다.

- 해단 패턴마다 사용 방법이 다르지만, 메커니즘 자체는 비슷합니다.

- 하나의 객체가 다른 객체와 소통은 하지만 묶이기(coupled)는 싫을 때 사용합니다.


Delegate

- Protocol을 정의하여 사용합니다.

- Protocol은 일종의 청사진 역할을 해, 프로토콜을 채택한 곳에서 청사진에 제시된 것들을 구현할 수 있습니다.

- Protocol에 원하는 이벤트의 정보를 받을 수 있게 함수의 원형을 정의한 뒤, 실제 뷰에서 사용하면 됩니다.

 

장점

  • 매우 엄격한 Syntax로 인해 프로토콜에 필요한 메소드들이 명확하게 명시됩니다.
  • 컴파일 시 경고나 에러가 떠서 프로토콜의 구현되지 않은 메서드를 알려줍니다.
  • 로직의 흐름을 따라가기 쉽습니다.
  • 프로토콜 메소드로 알려주는 것뿐만이 아니라 정보를 받을 수 있습니다.
  • 커뮤니케이션 과정을 유지하고 모니터링하는 제3의 객체(ex: NotificationCenter 같은 외부 객체)가 필요 없습니다.
  • 프로토콜이 컨트롤러의 범위 안에서 정의됩니다.

단점

  • 많은 줄의 코드가 필요합니다.
  • delegate 설정에 nil이 들어가지 않게 주의해야 합니다. (크래시를 일으킬 수 있습니다.)
  • 많은 객체들에게 이벤트를 알려주는 것이 어렵고 비효율적입니다.

Block

- 이벤트가 단 하나일 경우에 사용하기 좋습니다.

- Block은 Closure를 지칭하는 말이기도 합니다. (익명 함수)

- 하지만 캡처(=클로저나 블록 안에서 사용하는 함수 저장 방식)하는 방식이 다릅니다.

구분 Block Closure
Value Type 값을 복사해서 캡쳐함 (상수로 선언) 참조하여 캡쳐함 (상수로 선언)
Reference Type 참조하여 캡쳐함 (상수로 선언) 참조하여 캡쳐함 (상수로 선언)

- Closure는 무조건 값을 참조하여 내부에서 사용하게 됩니다.

- 보통 Block을 사용하는 경우가 Completion Handler에서 사용됩니다.


Notification

- Notification Center라는 싱글턴 객체를 통해서 이벤트들의 발생 여부를 옵저버를 등록한 객체들에게 Notification을 post 하는 방식으로 사용합니다.

- Notification Name이라는 Key 값을 통해 주고받을 수 있습니다.

 

장점

  • 많은 줄의 코드가 필요 없이 쉽게 구현이 가능합니다.
  • 다수의 객체들에게 동시에 이벤트의 발생을 알려줄 수 있습니다.
  • Notification과 관련된 정보를 Any? 타입의 object, [AnyHashable: Any]? 타입의 userInfo로 전달할 수 있습니다.

단점

  • key 값으로 Notification의 이름과 userInfo를 서로 맞추기 때문에 컴파일 시 구독이 잘 되고 있는지, 올바르게 userInfo의 value를 받아오는지 체크가 불가능합니다.
  • 추적이 쉽지 않을 수 있습니다.
  • Notificaiton post 이후 정보를 받을 수 없습니다.

KVO [ Key Value Observing ]

- A객체에서 B객체의 프로퍼티가 변화됨을 감지할 수 있는 패턴입니다.

- 앞서 소개한 다른 패턴들이 주로 Controller와 다른 객체 사이의 관계를 다룬다면 KVO패턴은 객체와 객체 사이의 관계를 다루는데 적합합니다.

- 메서드나 다른 액션에서 나타나는 것이 아니라 프로퍼티의 상태에 반응하는 형태입니다.

 

장점

  • 두 객체 사이의 정보를 맞춰주는 것이 쉽습니다.
  • new/old value를 쉽게 얻을 수 있습니다.
  • key path로 옵저빙 하기 때문에 nested objects도 옵저빙이 가능합니다.

 

단점

  • NSObject를 상속받는 객체에서만 사용이 가능합니다.
  • dealloc 될 때 옵저버를 지워줘야 합니다.
  • 많은 value를 감지할 때는 많은 조건문이 필요합니다.

내용 출처

https://medium.com/@Alpaca_iOSStudy/delegation-notification-%EA%B7%B8%EB%A6%AC%EA%B3%A0-kvo-82de909bd29

 

Delegation, Notification, 그리고 KVO

언제, 어디서 써야할까?

medium.com

 

https://velog.io/@kirri1124/Delegate-Block-Notification

 

Delegate, Block, Notification

3가지의 패턴 알아보기

velog.io