티스토리 뷰

iOS

[iOS] NotificationCenter 톺아보기

국산 앨런 2019. 9. 5. 08:43

iOS 환경에서 백그라운 작업의 결과, 비동기 작업의 결과 등 현재 작업의 흐름과 다른 흐름의 작업으로부터

 

이벤트를 받으려고 할 때 Notification을 많이 사용합니다.

 

예를 들면, 대용량 파일을 다운로드하는 스레드를 생성하고 다른 페이지에서 다른 작업으로 넘어가도 다운로드 완료 알림 팝업을 띄울 수 있는 것이 있습니다.

 

물론 다른 방법도 존재하지만... 예를 들자며는... 그렇다는 겁니당

 

 

Notification

Notification Center를 통해 정보를 전달하기 위한 구조체입니다.

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

 

NotificationCenter

등록된 옵저버에게 동시에 노티피케이션을 전달하는 클래스입니다. 

 

NotificationCenter 클래스는 노티피케이션을 발송하면 노티피케이션 센터에서 메세지를 전달한 옵저버의 처리할 때까지 대기합니다.

 

즉, 흐름이 동기적(synchronous)으로 흘러갑니다. 노티피케이션을 비동기적으로 사용하려면 NotificationQueue를 사용하면 됩니다.

 

사용예

 // 옵저버 등록
 NotificationCenter.default.addObserver(self, selector: #selector(didRecieveTestNotification(_:)), name: NSNotification.Name("TestNotification"), object: nil)

 @objc func didRecieveTestNotification(_ notification: Notification) {
         print("Test Notification")
 }
 
 ...
 
 // 노티피케이션 발송
 NotificationCenter.default.post(name: NSNotification.Name("TestNotification"), object: nil, userInfo: nil)​

 

User Info 정보를 담은 경우

 

// 옵저버 등록
NotificationCenter.default.addObserver(self, selector: #selector(didReceiveTestNotification(_:)), name: NSNotification.Name("TestNotification"), object: nil)

@objc func didReceiveTestNotification(_ notification: Notification) {
 		guard let testString: String = notification.userInfo?["TestString"] as? String else { return }
         print("testString :", testString)
 }
 
 ...
 
 // 노티피케이션 발송자
 
 let userInfo: [AnyHashable: Any] = ["TestString":"Hi"]

 NotificationCenter.default.post(name: NSNotification.Name("TestNotification"), object: nil, userInfo: userInfo)​

 

 

 

 

 

참고 : https://www.edwith.org/boostcourse-ios/lecture/16919/

댓글
공지사항