Delegate, Block, Notification

Tabber·2021년 12월 19일
0

iOS Review

목록 보기
3/15

공부하면서 적는 글입니다! 정확하지 않을 수 있습니다.

이 셋은 뭐야?

오늘 알아볼 3개의 기능들은 보통 '하나의 객체가 다른 객체와 소통은 하고 싶지만, 묶이기는 싫을 때' 사용한다.

Delegate

Delegate는 프로토콜을 정의하여 사용한다.
프로토콜은 일종의 청사진 역할을 하여 프로토콜을 채택한 곳에서는 청사진에 제시된 것들을 구현할 수 있게끔 한다.

프로토콜에 우리가 원하는 이벤트들의 정보를 받을 수 있게끔 함수의 원형을 정의해놓고 난 뒤에, 실제뷰에서 사용하면 된다.

장점

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

단점

  • 많은 줄의 코드가 필요하다.
  • delegate 설정에 nil이 들어가지 않게 주의해야 한다.
  • 많은 객체들에게 이벤트를 알려주는 것이 어렵고 비효율적이다.

Block

이벤트가 딱 하나 일 때 사용하기 좋다.
Block은 Closure를 지칭하는 말이기도 하다. (익명함수)

근데 캡쳐하는 방식이 다르다.
캡쳐란 클로저나 블럭 안에서 사용하는 함수저장의 방식을 말한다.
Block

  • Value Type : 값을 복사해서 캡쳐함. 상수로 선언되어 바꿀 수 없음.
  • Reference Type : 참조하여 캡쳐함. 상수로 선언되어 바꿀 수 없음.

Closure

  • Value Type : 참조하여 캡쳐함. 상수로 선언되어 바꿀 수 없음.
  • Reference Type : 참조하여 캡쳐함. 상수로 선언되어 바꿀 수 없음.

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

암튼 보통 Block 을 사용하는 경우가 Completion Handler 에서 사용한다.

Notification

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

장점

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

단점

  • key 값으로 Notification의 이름과 userInfo를 서로 맞추기 때문에 잘 구독이 되고 있는지 알수가 없다.
  • 추적이 쉽지가 않다.
  • Notification Post이후의 정보를 받을 수가 없다.

Key-Value Observing(KVO)

KVO는 A 객체에서 B객체의 프로퍼티가 변화됨을 감지할 수 있는 패턴이다.
메서드나 다른 액션에서 나타나는 것이 아니라 프로퍼티의 상태에 반응하는 형태이다.
프로퍼티의 didSet , WillSet 과 같은 것이 KVO다.
장점

  • new/old Value를 쉽게 얻을 수 있다.
  • 두 객체 사이의 정보를 맞춰주는 것이 쉽다.

단점

  • 많은 value를 감지할 때는 많은 조건문이 필요하다.
profile
iOS 정복중인 Tabber 입니다.

0개의 댓글