https://developer.apple.com/documentation/foundation/notificationcenter
처음에 object에 보내고 싶은 데이터를 보내는 줄 알았다.
(사실 그냥 편하게 딕셔너리 사용안하고 데이터 전송하고 싶었던 것일지도(?))
문서를 제대로 보자..^^
var choice: Choice = Choice()
NotificationCenter.default
.post(
name: NSNotification.Name(Topic.Action.expandImage.identifier),
object: self,
userInfo: ["Choice": choice]
)
NotificationCenter.default
.publisher(for: Notification.Name(Topic.Action.expandImage.identifier), object: currentTopicCell)
.receive(on: DispatchQueue.main)
.sink{ [weak self] receive in
if let choice = receive.userInfo?["Choice"] as? Choice {
self?.coordinator?.startImagePopUp(choice: choice)
}
}
.store(in: &cancellables)
currentTopicCell에서 tap이 발생할 경우, notification을 전송하고 있기 때문에 object를 currentTopicCell로 설정하였다.
한 가지 테스트를 해보았는데, cell을 notification을 발송하는 상황에서 publisher에 object로 view controller인 self를 설정하면 알림이 오지 않는다. 반면에 nil로 설정할 경우, 발송인이 누구인지 고려하지 않고 notification name이 같은 모든 알림을 수신하기 때문에 알림이 오는 것을 확인할 수 있었다.
notification center는 싱글턴 인스턴스이다. notification 수신을 안전하게 처리하기 위해서는 object 지정을 해주는 것이 좋을 것 같다.
//object self 지정 -> 알림이 오지 X
.publisher(for: Notification.Name(Topic.Action.expandImage.identifier), object: self)
//object 지정X 하거나, currentTopicCell 지정 -> 알림을 받음
.publisher(for: Notification.Name(Topic.Action.expandImage.identifier), object: nil)
.publisher(for: Notification.Name(Topic.Action.expandImage.identifier), object: currentTopicCell)
let imageExpandNotificationObserver = NotificationCenter.default
.addObserver(
forName: Notification.Name(Topic.Action.expandImage.identifier),
object: currentTopicCell,
queue: nil
) { [weak self] notification in
if let choice = notification.userInfo?["Choice"] as? Choice {
self?.coordinator?.startImagePopUp(choice: choice)
}
}
//view가 사라질 때, 아래 코드 작성 필요
NotificationCenter.default.removeObserver(imageExpandNotificationObserver)
throttle (0) | 2024.02.29 |
---|---|
Combine은 withLatestFrom을 제공하지 않는다 (0) | 2023.12.25 |
RunLoop.main과 DispatchQueue.main (0) | 2023.12.13 |