NotificationCenter
Intro
이전에 저는 키보드에 의해 TextField
가 가려지는 문제점에 대한 해결법을 포스팅한 적이 있습니다. 해당 포스팅에서 NotificationCenter
에 대해 간단히 언급을 했었습니다.
오늘은 바로 이 NotificationCenter
에 대해 알아보는 시간을 갖도록 하겠습니다.
1. What is NotificationCenter
NotificationCenter
의 동작 방식을 간단히 설명하자면 다음과 같습니다.
“특정 객체가 NotificationCenter
에 등록된 Event
를 발생시키면 해당 Event
를 처리할 것이라고 등록된 Observer
들이 Event
에 대한 행동을 취하는 것이NotificationCenter
가 동작하는 방식입니다. 이렇게 특정 객체가 Event
를 발생시키는 것을 Post
라고 합니다.”
NotificationCenter
는 Delegate Pattern
과 함께 어플리케이션 내에서 객체가 서로 상호작용할 수 있는 방법 중 하나입니다.
제가 작성한 Delegation Pattern 에 관한 포스팅도 있습니다.
Delegate Pattern
이 지정된 객체와만 상호작용할 수 있는 반면 NotificationCenter
는 어플리케이션 어느 곳에서, 어느 객체와도 상호작용을 할 수 있습니다.
그럼 본격적으로 NotificationCenter
를 간단하게 이용해보는 예제를 만들어보도록 하겠습니다.
2. NotificationCenter
Setting
NotificationCenter
를 사용하기 위한 절차는 다음과 같습니다.
- 먼저
Event
를 발생시키는 객체에서Event
를NotificationCenter
에 등록합니다. Event
에 대한 행동을 취해줄 객체에서Observer
로 등록을 합니다.
그럼 본격적으로 예제를 만들어보도록 하겠습니다. 프로젝트를 하나 생성하시고 기본적으로 생성되는 Main.storyboard
에 ViewController
를 두 개를 더 올리신 후 총 세 개의 ViewController
를 동시에 선택하시고 Editor->Embed in->Tab Bar Controller
를 통해 세 ViewController
를 Tab Bar Controller
로 묶어줍니다.
그리고 위의 사진과 같이 한 곳에선 UIButton
을 나머지 두 곳에는 UILabel
올려줍니다. 그리고 하나의 UILabel
은 기본적으로 Hidden
, 즉 보이지 않게 설정을 합니다.
이제 예제를 간단히 설명드리자면 UIButton
이 있는 ViewController
에서 버튼을 눌렀다는 Event
를 NotificationCenter
에 Post
하면 나머지 UILabel
이 있는 두 ViewController
가 Observer
가 되는데 보이지 않는 UILabel
은 보여지고, 나머지 하나의 UILabel
은 사라지는 예제가 될 것입니다.
즉 하나의 이벤트에 대해 서로 다른 동작을 동시에 수행할 수 있게 되는 것입니다.
먼저 Observer
가 될 ViewController
들의 파일을 만들고 스토리보드에서 Class로 지정하고 각각의 UILabel
을 @IBOutlet
으로 연결시킵니다.
3. Post
그럼 바로 Event
를 발생시키는 코드를 ViewController.swift
, UIButton
이 있는 ViewController
에 작성해보도록 하겠습니다.
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func postBtnTapped(_ sender: Any) {
NotificationCenter.default.post(
name: NSNotification.Name(rawValue: "PostButton"),
object: nil)
}
}
코드를 확인해보시면 상당히 직관적이라는 것을 확인하실 수 있습니다. 버튼이 눌리면
NotificationCenter
에 PostButton
이라는 Event
등록하고 이를 발생시킨다 라는 의미입니다. 간단하죠?
object:
매개변수를 통해Event
를 발생시킬 때 특정 객체를 같이 넘길 수 있습니다. 우리의 예제에서는 아무것도 넘기지 않기 때문에nil
로 설정하였습니다.
그럼 이제 Observer
객체를 작성해보도록 하겠습니다.
4. Observer
먼저 PostButton
이라는 이름의 Event
가 발생하면 Hidden
으로 설정한 UILabel
을 보이게 끔 하는 Observer
등록해보도록 하겠습니다.
class ObserverOneViewController: UIViewController {
@IBOutlet weak var hiddenLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self,
selector: #selector(showLabel),
name: NSNotification.Name(rawValue: "PostButton"),
object: nil)
}
@objc func showLabel(){
hiddenLabel.layer.isHidden = false
}
}
역시 코드가 굉장히 직관적이실 겁니다.
이 객체(self
)를 PostButton
이라는 이름(name
)의 Event
가 발생했을 때 행동을 취하는 객체로 등록할 것인데 (NotificationCenter.default.addObserver
), 그러한 행동의 내용(#selector
)은 showLabel
이라는 함수에 정의되어 있다는 뜻입니다.
한마디로 정리하자면 PostButton
이 발생하면 showLabel
이라는 함수가 실행되는 것입니다.
다음은 UILabel
을 숨기는 Observer
코드를 작성해보도록 하겠습니다.
class ObserverTwoViewController: UIViewController {
@IBOutlet weak var willBeHiddenLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self,
selector: #selector(hideLabel),
name: NSNotification.Name(rawValue: "PostButton"),
object: nil)
}
@objc func hideLabel(){
willBeHiddenLabel.layer.isHidden = true
}
}
첫 번째 Observer
의 코드를 이해하셨다면 두 번째 Observer
코드는 아주 쉽게 이해하실 수 있으실 겁니다.
마무리
결과물은 다음과 같습니다. GIF 파일이라 확인이 어려우실 수 있으니 반드시 예제를 따라해보시고 직접 실행해보시길 바랍니다.
오늘은 이렇게 NotificationCenter
에 관해 알아보았습니다. 감사합니다.
Source : github
참고자료