티스토리 뷰

iOS & swift

NotificationCenter

ggasoon2 2023. 7. 26. 15:26

 

 

VC간 데이터를 주고 받거나 상호작용을 하기 위해서는

next vc에 데이터를 직접적으로 전달하거나, delegate 방식으로 전달(https://ggasoon2.tistory.com/6)
또는 rxSwift subscribe binding(https://ggasoon2.tistory.com/25)등을 이용하여

데이터나 trigger를 전달 할 수 있습니다.

 

그런데 VC가 여러개 중첩되어 있을 경우 delagte나 subcrbie vm을 전달하기가 쉽지가 않을 것 같아요.

 

그럴 경우 Notifcation을 이용하면 간편하게 거리가 먼 VC에 데이터를 전달할 수 있습니다.

 

 

 

1. Notification observable emit (발신)

 

NotificationCenter.default.post(name: Notification.Name("createUser"), 
                                             object: "e.g. id is 1234")

-> 호출을 보내고자하는 시점에 notification을 post합니다.

그리고 object에 값을 넣을 수 있음. (int, string, struct 등..)

 

 

 

2. Notifcation subscribe (수신)

 

Observer를 등록해 두면 Notification이 post 될때마다 함수가 동작하도록 합니다.

 

NotificationCenter.default.addObserver(self, selector: #selector(updateUserData(_:)), 
                                 name: Notification.Name("createUser"), object: nil)

@objc func updateUserData(_ notification: Notification) {
    guard let id = notification.object as? String else { return }
    print(id) // e.g. id is 1234 출력
}

 

 

3. Notification remove (Observer 제거)

 

해당 Notification을 더 이상 쓰지않는 경우 removeObserver를 호출하여 제거하도록합니다

viewWillDisapear나 더 이상 호출하지 않길 원하는 시점에 사용하면 좋을듯 합니다.

 

NotificationCenter.default.removeObserver(self, name: NSNotification.Name("createUser"), 
                                                                           object: nil)

 

 

+ 추가 extension Notification name

 

Name 값에 string을 넣어주는 대신에

extension Notification.Name {
    static let createUserNotification = Notification.Name("createUser")
}

 

이런식으로 Notifcation Name 객체를 만들어 string 대신 변수값으로 넣어 오탈자 오류를 방지할 수 있음

 

// 수정전.
NotificationCenter.default.post(name: Notification.Name("createUser"), object: res)


// 수정후.
NotificationCenter.default.post(name: .createUserNotification, object: res)

 

 
댓글