NotificationCenter
애플 공식 문서에는 이렇게 적혀있다
A notification dispatch mechanism that enables the broadcast of information to registered observers.
등록된 Observer들에게 정보를 BroadCast할 수 있는 알림 발송 메커니즘
이전에 사용했을 때는 주로 키보드가 올라올 때, 내려갈 때 TextField가 가려지는 문제를 해결하기 위해서 사용한 경험이 있다.
오늘은 좀 더 자세히 알아보자
어떤 객체가 Post를 하면 Observe하고 있던 Observer들에게 BroadCast를 한다.
(....? Delegate랑 똑같은 거 아냐?)
맞다. 어떤 객체가 다른 객체와 소통/송수신 한다는 메커니즘은 같다
Delegate 패턴의 사용 예
protocol SomeDelegate{
func sayName(name: String)
}
class FirstView: UIView{
// 순환 참조 사이클을 막기 위해 강한 참조가 아닌 약한 참조로 선언한다
// 이벤트를 발생할(책임을 전가하는) 타입에서는 Delegate를 프로퍼티로 선언한다
weak var delegate: SomeDelegate?
func tappedButton(){
delegate?.sayName(name: "tree")
}
}
// 동작을 수행할 타입에는 Delegate를 채택한다
class SomeController: SomeDelegate{
var view: SomeView = SomeView()
init(){
view?.delegate = self
}
// SomeDelegate 채택 후, 준수
func sayName(name: String){
print(name) // tree
}
}
크게 5가지만 생각하면 된다
- Delegate 패턴을 위한 Protocol 선언
- 책임을 전가할 타입(위임자)에서 delegate를 프로퍼티로 선언 -> 이때, 순환 참조 사이클을 막기 위해 약한 참조 사용
- 동작을 수행할 타입(대리자)에서 delegate를 채택
- 위임자에 있는 delegate를 대리자의 객체로 초기화
- 대리자에서 프로토콜을 준수
장점 : 코드를 이해하며 따라가기 쉬움
단점 : 많은 객체들에게 이벤트를 알려주는 것이 어렵고 비효율적
Notification
- NotificationCenter 라는 싱글톤 객체를 통해 이벤트들의 발생 여부를 옵저버에게 알림.
- Notification.Name 이라는 Key 값을 통해 Post/Observe 가능
class PostVC: UIViewController{
@IBOutlet var button: UIButton!
@IBAction func sendNotification(_ sender: UIButton){
NotificationCenter.default.post(name: Notification.Name("buyEmoticon"), object: nil)
}
}
class ViewController: UIViewController{
override func viewDidLoad(){
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(sayHello(noti:)), name: Notification.Name("buyEmoticon"), object: nil)
}
deinit{
NotificationCenter.default.removeObserver(self)
}
@objc func sayHello(noti: Notification){
print("Hello") // Hello
}
}
장점
- 많은 줄의 코드가 필요없이 이벤트/동작을 구현할 수 있다
- 다수의 객체들에게 동시에 이벤트의 발생을 알려줄 수 있음
단점
- 추적이 쉽지 않음
- post 이후 정보를 받을 수 없음
결론
- 가능하다면 Delegate로 구현하되, 하나의 이벤트로 다수의 객체에서 어떠한 동작을 해야하는 경우에만 NotificationCenter를 사용
- NotificationCenter를 사용해야 하는 이벤트들의 경우 NotificationCenter 사용
'iOS' 카테고리의 다른 글
[iOS] Local Push Notification 로컬 알림 처리하기 (0) | 2021.01.21 |
---|---|
[iOS] Local Push Notification 로컬 알림 (0) | 2021.01.21 |
[iOS] Build input file cannot be found: '...../Info.plist' 오류 (0) | 2021.01.14 |
[iOS] 화면 전환시 ViewController의 생명주기 (0) | 2021.01.12 |
[iOS] ViewController 화면 전환 (Segue) (0) | 2021.01.12 |