Delegate,Block,Notification,KVO
정의
- 해당 패턴들은 대부분 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를 감지할 때는 많은 조건문이 필요합니다.
내용 출처
Delegation, Notification, 그리고 KVO
언제, 어디서 써야할까?
medium.com
https://velog.io/@kirri1124/Delegate-Block-Notification
Delegate, Block, Notification
3가지의 패턴 알아보기
velog.io