맛동산이

Notification Center 이란? Delegate와의 차이점에 대해 본문

앱/Swift

Notification Center 이란? Delegate와의 차이점에 대해

진ddang 2023. 3. 21. 22:51

Notification Center


처음에 어플리케이션을 만들때, 콜렉션뷰에서 cell 내부의 버튼을 통해서 현재 cell의 이미지를 홈뷰 이미지뷰에 넣어주기 위해서 cell 내부에는 클로저를, item controller에는 delegate를 사용해서 homeView에 이벤트를 넘겨주었는데 작동하지 않았다.

Notificatin Center

우선 Notification Center은 클래스이다.

그리고 이 Notification Center의 인스턴스는 enables the broadcast of information to registered observers,라는 역할을 하는데,

번역하자면 등록된 옵저버들에게 정보를 전달해주는 역할을 한다는 뜻이다.

노티피케이션 센터는 옵저버 패턴이다.

옵저버란, 스타크래프트에서 프로토스 유닛으로 다른 정찰병을의미 한다.

정찰, 즉 어떠한 객체를 계속해서 지켜보다가, 변화를 감지하고 그것에 대한 작동을 하게 되는 방식을 옵저버패턴이라고 하는데, 정확한 의미를 한번 알아보자

observer design pattern

옵서버 패턴은 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴이다. 주로 분산 이벤트 핸들링 시스템을 구현하는 데 사용된다

-위키피디아-

왜 델리게이트는 사용하지 않나요??

delegate 패턴은, 객체 안에 하나의 delegate이라는 프로퍼티를 생성하고, 해당 객체에서 일어나는 이벤트를 다시금 다른 객체로 넘겨주게 된다. 즉 각각의 객체 마다 delegate를 하나식 생성해주고 연결해주는 작업이 필요한 것이다. 하지만 만일 위의 나의 경우와 같은 많은 객체들에게 변화를 감지시키고, 이벤트를 전달해주려고 한다면 이는 매우 비효율적인 과정이 된다.

따라서 이를 효율적으로 사용하기 위해서 observer 패턴인 notification center를 사용하게 되는것이다.

notification center의 단점

notification center는 여러 객체에게 이벤트를 전달해준다는 점에서는 상당한 강점을 가지고 있지만,

컴파일 과정에서 구독의 연결, 그리고 userinfo 와 value를 어떠한 값을 가져오는지 와 같은 코드의 흐름과 post와 같은 행동을 한 이후의 결과를 확인할수 없는 단점을 가지고 있다.

따라서 어떠한 특정 코드의 흐름과, value와 같은 동작을 추적하기 위해서는 delegate를, 하나의 객체에서 여러 객체로 이벤트를 뿌려줄때는 notification center를 사용하는것이 바람직하다.


notification center사용방법

notification center는 크게 3가지 역할을 가지고 서로 정보를 주고 받는다.

  1. publisher : 알람을 만들어 낸다.
  2. observer(subscriber) : 알람을 관찰한다.
  3. notification center : 알람을 전달한다.
Notification.default

노티피케이션 센터는 싱글톤과 비슷하게 , UIApplication에서 default값으로 설정되어 있다.

이는 싱글톤과 비슷하게 사용하는것이지만, 정확히는 싱글톤은 아니기 때문에 임의의 notification center를 만들어서 사용도 가능하다.

post()

NotificationCenter.default.post(name: Notification.Name(name: "workCompleted"), object: nil)

NotificationCenter.default.post() 메소드를 사용해서 알람을 보내게 된다.

post(name: Notification.Name(name: “somthingCompleted”), object: nil)

이때 사용하는 메소드 post에서 name과 object파라미터를 받게 되는데 여기에서 생성하는 name파라미터를 통해서 Notification.Name(name: “somethingCompleted”)를 만들게 된다.

이것의 의미는 내가생성한 알람의 이름이 somethingCompleted이며, 이것을 NotificationCenter로 넘긴다는 뜻이다. 이때 object를 통해서 객체를 넘길수도 있다.

addObserver()

위에서 발생한 알람을 NotificationCenter에서 수립하고, 한번에 연결된 subscriber(observer)에게 해당 notification을 보내주는것으로 이벤트를 입력받고 핸들링하게 된다 .

이때 이러한 Notification와 연결을 해줘야하는데, 이때 사용하는 메소드가 addObserver()이다.

NotificationCenter.default.addObserver(forName: Notification.Name("workCompleted"), object: nil, queue: nil) { _ in
  // Handler ...
  print("Work Completed!")
}

또는 다음과 같은 형태로 사용하기도 한다.

func addObserver(
    _ observer: Any,
    selector aSelector: Selector,
    name aName: NSNotification.Name?,
    object anObject: Any?
)

이때 파라미터는 다음과 같다.

  1. observer : 구독을 해서 동작할 객첼르 선택함(보통 ViewController가 될것으로 예상됨)
  2. selector : 구독을하고 알람을 감지했을때 작동할 함수(objective-c코드기때문에 어노테이션필수)
  3. name : 어떤 알람이랑 연동되는지 알려줘야하는 부분, NSNotification.Name이기때문에 이름으로 알람을 확인함.
  4. object : 관찰자에게 보내는 객체이다. 이것은 notification.object로 접근가능.

removeObserver()

보통 viewDidLoad()에 observer를 달아두기 때문에 메모리관리를 위해서라도, deinit해줘야한다.

이를 위한 코드가 removeObserver()

viewDidDisappear이후나, willDissappear을 사용해서 제거한다.

정리

NotificationCenter란, 하나의 정보를 모아서 뿌려주는 객체이다.

NotificationCenter에 post()메소드를 사용해서 어떠한 행동이 발생했다는 알람을보내준다.

NotificationCenter에 post()를 통해서 보내준 알람을 addObserver()를 통해서 받아주고 그안에서 핸들링해준다.

하지만 NotificationCenter도 결국에는 객체가 객체에게 정보를 알람을 보내주는것이기 때문에, delegate와 동일하게 두 객체 모두 메모리에 올라와있는 상태여야 한다.

반응형