👨🏻‍💻iOS 공부/iOS & Swift

[iOS] 내가 보려고 쓰는 NotificationCenter 사용법

728x90
반응형

NotificationCenter를 직역하면 알림센터가 된다.

사실 말 그대로 "알림을 통해 액션을 통제"하는 역할을 한다.

 

많은 서적, 영상에서 NotificationCenter를 방송국으로 비유하기도 하는데, 그 이유는 차차 읽다보면 알 수 있다. 

 

NotificationCenter : 자자 액션이 수행되었으니, 각 담당자들은 업무 수행 바람~ 
VC1 : 넵
VC2: 네~
VC3: 네!

 

NotificationCenter가 관제탑이 되는 것이고, 각 VC 1,2,3에게 각 업무를 수행해야하는 시점에 말해주는 것이다. 

(마치 방송국에서 전파를 쏘고, 각 가정집의 TV에서 이를 수신하여 화면을 보여주는 것과 같아서 그렇게 비유하는 듯 하다.)

 

만약 VC1이 화면에서 사라질 때, VC2의 버튼을 회전시키고 싶다면 아래와 같이 진행해 볼 수 있을 것이다. 

 

Notification.Name 정하기 

// 관측할 Notification의 이름을 정한다
// VC1 or VC2 아무 상관 없음

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

이렇게 정해둔 이름은 액션을 수행할 "수행자" 정도로 생각하면 될 것 같다. 

이 수행자에게 알림을 주면, 다른 VC에 있던 수행자가 명령을 받고 일을 시작한다고 보면 된다!

 

이제 이름을 추가했으니, 관제탑에서 명령을 하달하는 방식을 구현해보자. 

 

NotificationCenter.default.post로 명령하기

// VC1의 viewWillDisappear

override func viewWillDisappear(_ animated: Bool) {
    // VC2에게 명령 하달! 
    NotificationCenter.default.post(name: .rotateBack, object: nil)
}

VC1이 사라질 때 알림을 보내주기 위해 viewWillDisappear에 구현해두었다. 

 

이제 알림을 보냈으니, 수신할 차례이다. 

 

NotificationCenter.default.addObserver로 수신하기

// VC2의 viewDidLoad

override func viewDidLoad() {
    super.viewDidLoad()
    // VC1에서 보낸 알림 수신 완료! 이제 액션을 수행하겠음!
    NotificationCenter.default.addObserver(self, selector: #selector(rotate), name: .rotateBack, object: nil)
}

@objc func rotate() {
    // 수행할 업무 작성!
}

addObserver를 사용함으로써 "VC2에 수행자를 대기시키겠다, 알림이 오면 수행!"과 같은 의미를 갖게 된다. 

파라미터 중 selector는 수행자가 수행할 액션을 의미하고, name은 아까 정해둔 수행자의 이름을 의미한다! 

 

delegate나 closure등으로도 수행할 수 있지만, 하나의 VC가 아닌 여러 개의 VC를 통제하기에 좋은 방법이다.

1:1에 좋은 것 보다는 1:N에 좋으니 상황에 맞게 적절하게 사용하면 좋을 것 같다!

728x90
반응형