Swift

[Swift] 노티피케이션 센터와 노티피케이션

devharrry 2018. 9. 16. 15:58

iOS 환경에서 사용하는 옵저버 패턴을 사용하는 노티피케이션 센터와 노티피케이션에 대해 알아보려고 합니다.



Notification


등록된 노티피케이션에 노티피케이션 센터를 통해 정보를 전달하기 위한 구조체입니다. 


주요 프로퍼티 


name : 알림을 식별하는 태그


var name: Notification.Name
cs



object : 발송자가 옵저버에게 보내려고 하는 객체. 주로 발송자 객체를 전달하는데 쓰입니다. 


var object: Any?
cs



userInfo : 노티피케이션과 관련된 값 또는 객체의 저장소 

예) 특정 행동으로 인해 작업이 시작되거나 완료되는 시점에 다른 인스턴스로 노티피케이션이 발생 시 필요한 데이터를 같이 넘겨줄 수 있습니다.

간단한 예로 네트워킹을 이용하는 앱이라면 네트워킹이 시작 및 완료되는 시점, 음악 및 동영상 재셍 등에도 재생이 끝나는 시점에 관련 정보를 넘겨줄 수 있습니다.


var userInfo: [AnyHashable : Any]?​
cs



NotificationCenter


등록된 옵저버에게 동시에 노티피케이션을 전달하는 클래스입니다. NotificationCenter 클래스는 노티피케이션을 발송하면 노티피케이션 센터에서 메시지를 전달한 옵저버가 처리할 때까지 대기합니다. 즉, 흐름이 동기적으로 흘러갑니다. 노티피케이션을 비동기적으로 사용하려면 NotificationQueue를 사용하면 되겠습니다.


기본 노티피케이션 센터 얻기 


default : 애플리케이션의 기본 노티피케이션 센터.


class var `default`: NotificationCenter { get }​
cs



옵저버 추가 및 제거


addObserver(forName:object:queue:using:) : 노티피케이션을 노티피케이션 대기열과 대기열에 추가할 블록(클로저), 노티피케이션 이름을 노티피케이션 센터의 메서드를 가리키는 장소(디스패치 테이블)에 이름을 추가합니다. 여기서 object에 특정 객체를 명시하면 명시한 객체가 발송한 노티피케이션일 때에만 해당 이름의 노티피케이션을 수신합니다.


func addObserver(forName name: NSNotification.Name?, 
                 object obj: Any?, 
                 queue: OperationQueue?, 
                 using block: @escaping (Notification) -> Void-> NSObjectProtocol
cs




addObserver(_:selector:name:object:) : 노티피케이션을 노티피케이션 센터의 메서드를 가리키는 장소에 이름을 추가.


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




removeObserver(_:name:object:) : 노티피케이션 센터의 메서드를 가리키는 장소에서 일치하는 이름을 제거.


func removeObserver(_ observer: Any, 
                    name aName: NSNotification.Name?, 
                    object anObject: Any?)
cs


노티피케이션 발송


post(_:) : 지정된 노티피케이션을 노티피케이션 센터에 발송.


func post(_ notification: Notification)
cs



post(name:object:userInfo:) : 지정된 이름, 보낸 객체, 보낼 정보로 노티피케이션을 만들어 노티피케이션 센터에 발송.


func post(name aName: NSNotification.Name,
          object anObject: Any?, 
          userInfo aUserInfo: [AnyHashable : Any]? = nil)
cs



post(name:object:) : 지정된 이름, 보낸 객체로 노티피케이션을 만들어 노티피케이션 센터에 발송.


func post(name aName: NSNotification.Name, object anObject: Any?)
cs


예제


일반 노티피케이션 


옵저버 등록 


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


발송자


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



UserInfo 정보를 담은 노티피케이션 


옵저버 등록 


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"asString else { return }
    
    print("testString :", testString)
}​
cs


발송자


let userInfo: [AnyHashable: Any] = ["TestString":"Hi"]
 
NotificationCenter.default.post(name: NSNotification.Name("TestNotification"), 
                                object: nil, 
                                userInfo: userInfo)​
cs



참고 : [edwith 부스트코스] iOS Developer