티스토리 뷰
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)
'iOS' 카테고리의 다른 글
[iOS] Architectures (MV*, VIPER, ReactorKit, RIBs) (0) | 2020.03.02 |
---|---|
[iOS] Grand Central Dispatch (GCD) 톺아보기 (0) | 2019.09.05 |
[iOS] App Transport Security (ATS) 톺아보기 (0) | 2019.09.05 |
[iOS] URLSession, URLSessionDataTask 톺아보기 (0) | 2019.09.05 |
[iOS] Tab Bar 톺아보기 (0) | 2019.09.04 |
댓글
공지사항