적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Swift iOS 앱 개발/Swift

[Swift iOS] NotificationCenter & Observer

hongssup_ 2021. 9. 23. 14:49
반응형

NotificationCenter에 등록된 이벤트가 발생하면 해당 이벤트들에 대한 행동을 취하는 것. 

앱 내에서 아무데서나 메시지를 던지면 앱 내의 아무데서나 이 메시지를 받을 수 있게 해 주는 것이 NSNotificationCenter의 역할. 

 

post

옵저버에게 전달할 값을 전송해주는 부분 

NotificationCenter.default.post(name: Notification.Name("이벤트이름"), object: 전달할값)

 

Add Observer 

Notification.Name("")을 탐지하고 있다가 해당 이름으로 notification이 전송되면 수행하는 부분. 

NotificationCenter.default.addObserver(self, selector: #selector(호출할함수), name: NSNotification.Name(rawValue: "이벤트이름"), object: nil)

 

post 사용 시 전달할 값(object)은 보통 null 로 보내주지만 

전달하고자 하는 값이 있다면, observer에 #selector로 지정해준 함수 안에서 다음과 같이 불러올 수 있다.

@objc func 호출함수(_ noti: Notification) {
    print(noti.object)
}

그런데 String 값을 전달해도 noti.object가 Any? 타입으로 넘어오기 때문에, 다음과 같이 설정해서 사용할 수 있다. 

guard let value = noti.object as? String else { return }

 

Remove Observer 

NotificationCenter는 싱글턴 인스턴스?라서 여러 오브젝트에서 공유한다? 

그래서 옵저버를 등록한 오브젝트가 메모리에서 해제되면 NSNotificationCenter에서도 옵저버를 없앴다고 알려줘야. 

//self에 등록된 옵저버 전체 제거
NotificationCenter.default.removeObserver(self)

//특정 옵저버 하나 제거
NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: "이벤트이름"), object: nil)

보통은 counterpart 되는 곳에 맞춰서 해제를 시켜준다고 한다. 

viewWillAppear <-> viewWillDisappear

viewDidLoad() <-> deinit() 

 

 

참고 : jinshine_NotificationCenter,  

728x90
반응형