티스토리 뷰

Swift + iOS/iOS

[ios] NotificationCenter

군옥수수수 2017. 11. 20. 23:30

NotificationCenter

Intro

이전에 저는 키보드에 의해 TextField가 가려지는 문제점에 대한 해결법을 포스팅한 적이 있습니다. 해당 포스팅에서 NotificationCenter에 대해 간단히 언급을 했었습니다.


오늘은 바로 이 NotificationCenter에 대해 알아보는 시간을 갖도록 하겠습니다.


1. What is NotificationCenter

NotificationCenter의 동작 방식을 간단히 설명하자면 다음과 같습니다.


“특정 객체가 NotificationCenter에 등록된 Event를 발생시키면 해당 Event를 처리할 것이라고 등록된 Observer들이 Event에 대한 행동을 취하는 것이NotificationCenter가 동작하는 방식입니다. 이렇게 특정 객체가 Event를 발생시키는 것을 Post라고 합니다.”




NotificationCenterDelegate Pattern과 함께 어플리케이션 내에서 객체가 서로 상호작용할 수 있는 방법 중 하나입니다.


제가 작성한 Delegation Pattern 에 관한 포스팅도 있습니다.

Delegate Pattern이 지정된 객체와만 상호작용할 수 있는 반면 NotificationCenter는 어플리케이션 어느 곳에서, 어느 객체와도 상호작용을 할 수 있습니다.


그럼 본격적으로 NotificationCenter를 간단하게 이용해보는 예제를 만들어보도록 하겠습니다.


2. NotificationCenter Setting

NotificationCenter를 사용하기 위한 절차는 다음과 같습니다.


  1. 먼저 Event를 발생시키는 객체에서 EventNotificationCenter에 등록합니다.
  2. Event에 대한 행동을 취해줄 객체에서 Observer로 등록을 합니다.

그럼 본격적으로 예제를 만들어보도록 하겠습니다. 프로젝트를 하나 생성하시고 기본적으로 생성되는 Main.storyboardViewController를 두 개를 더 올리신 후 총 세 개의 ViewController를 동시에 선택하시고 Editor->Embed in->Tab Bar Controller를 통해 세 ViewControllerTab Bar Controller로 묶어줍니다.


그리고 위의 사진과 같이 한 곳에선 UIButton을 나머지 두 곳에는 UILabel 올려줍니다. 그리고 하나의 UILabel은 기본적으로 Hidden, 즉 보이지 않게 설정을 합니다.



이제 예제를 간단히 설명드리자면 UIButton이 있는 ViewController에서 버튼을 눌렀다는 EventNotificationCenterPost하면 나머지 UILabel이 있는 두 ViewControllerObserver가 되는데 보이지 않는 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)
    }
}

코드를 확인해보시면 상당히 직관적이라는 것을 확인하실 수 있습니다. 버튼이 눌리면 NotificationCenterPostButton이라는 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


참고자료


  1. iOS Notification Center in Swift 3
  2. Document
  3. stackoverflow


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함