본문 바로가기
IOS🍎/iOS+Swift

[iOS] Notification과 NotificationCenter

by Jouureee 2021. 4. 16.

NotificationCenter는 중앙집권적이다! 모든 뷰의 행동들을 감시하고 그에 해당하는 정보를 수신해 관리하는 곳이다. 여러 notification이 모여 있는데 각 viewController에 파견되어 감시하는 친구가 Observer이고 NotificationCenter에 Observer들이 등록되어 있다.

 

Observer와 Notification Center 그리고 notification의 관계를 각자 이름의 뜻을 잘 생각해보며 이해해보자

 

 

Notification

등록된 모든 observers NotificationCenter를 통해 정보를 전달하기 위한 구조체

 

  • var name : Notification.name //알림 식별 태그
  • var object: 발송자가 옵저버에게 보내려고 하는 객체. 주로 발송자 객체를 전달하는 데 쓰임
  • var userInfo : Notification과 관련된 값이나 객체의 저장소

 

Notification Center

동시에 등록된 옵저버에게 Notification을 전달하는 역할을 담당하는 클래스

Notification을 발송하면 Notificationcenter에서 메세지를 전달한 observer를 처리할때까지 대기 (sync)

비동기적인 처리를 원할 시 notificationQueue를 사용한다.

 

  • default : 애플리케이션의 기본 notification center

 

  • 옵저버 추가 및 제거
    • addObserver(forName:object:queue:using:) - Notification을 Center의 메소드를 가리키는 장소에 이름을 추가, 즉 옵저버를 등록해 notification 발송할 수 있게끔 함
    • removeObserver(_:name:object:) - 을 Center의 메소드를 가리키는 장소에서 일치하는 이름(name)을 제거

 

Notification

 

NotificationCenter.default.addObserver(self, 
                                       selector: #selector(didRecieveTestNotification(_:)), 
                                       name: NSNotification.Name("TestNotification"), 
                                       object: nil)
 
@objc func didRecieveTestNotification(_ notification: Notification) {
    print("Test Notification")
}

 

TestNotification이라는 이름을 가진 notification을 notificationCenter에 등록해두고 옵저버를 통해 이 이름을 가진 notification이 post(발송)될 시 didRecieve~ 함수가 실행되도록 함.

 

* 만약 object에 특정 객체 명시하면 명시한 객체가 발송한 Notification일때만 해당 이름의 Notification을 수신한다.

 

 

  • notification 발송
    • post(name:object:userInfo:) : 지정된 notification(name)을 보낸 객체(object)와 보낼 정보(userInfo)와 함께 notificationCenter에 보낸다.
NotificationCenter.default.post(name: NSNotification.Name("TestNotification"), object: nil, userInfo: nil)​

 

 

 

댓글