상세 컨텐츠

본문 제목

Combine과 함께 NotificationCenter 사용해보기

iOS/Combine

by 쑤야. 2023. 12. 10. 18:21

본문

문서 살펴보기


https://developer.apple.com/documentation/foundation/notificationcenter

 

NotificationCenter | Apple Developer Documentation

A notification dispatch mechanism that enables the broadcast of information to registered observers.

developer.apple.com

1. post 




  • object: notification을 보내는 객체
  • userInfo: notification에 추가로 담아야 하는 정보

 

처음에 object에 보내고 싶은 데이터를 보내는 줄 알았다.
(사실 그냥 편하게 딕셔너리 사용안하고 데이터 전송하고 싶었던 것일지도(?))
문서를 제대로 보자..^^

 


var choice: Choice = Choice()

NotificationCenter.default
    .post(
        name: NSNotification.Name(Topic.Action.expandImage.identifier),
        object: self,
        userInfo: ["Choice": choice]
    )

 

 

2. receive




  • object: notification을 보낸 발송인이 누구인지 지정하는 매개변수이다. 지정한 발송인이 보낸 notification만 받는 것이다. 만약 nil로 설정한다면, 배달 기준을 발송인으로 하지 않고 notification name만 동일하다면 알림을 받을 수 있다. 

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)

 

Combine을 사용하지 않는다면?


1. post


  • post 메서드는 Combine을 사용할 때와, 사용하지 않을 때가 동일하다. 

 

2. receive


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)

 

  • 위와 같이 등록과 해제 과정을 따로 작성해주어야 한다. Combine의 경우 등록과 해제를 함께 작성할 수 있기 때문에 간결하고, 가독성이 훨씬 좋다.

'iOS > Combine' 카테고리의 다른 글

throttle  (0) 2024.02.29
Combine은 withLatestFrom을 제공하지 않는다  (0) 2023.12.25
RunLoop.main과 DispatchQueue.main  (0) 2023.12.13

관련글 더보기