Old_SWIFT(221012)/기본이야기

NotificationCenter 다루기(쉬움주의, 따라만해)

KataRN 2021. 12. 21. 18:00
반응형

안녕하세요. KataRN입니다.

 

 

오늘은 NotificationCenter에 대해서 알아보겠습니다.

 

 

혹시 데이터 전달을 위한 다른 방법을 원하시는 분은 아래글을 참고해주세요~

https://katarnios.tistory.com/28

 

화면 간 데이터전달하기(쉬움주의, 따라만해)

안녕하세요. KataRN입니다. (수정_220120) 2개의 글을 하나로 합쳤습니다. 오늘은 화면간의 데이터 전달에 대해서 알아보겠습니다. 화면에서 화면으로 이동할때 데이터를 전달하고 받는 방법입니다.

katarnios.tistory.com

 

NotificationCenter란? (직설적으로 기능으로 설명하겠습니다.)

화면A에 관찰자를 등록합니다. 그리고 관련이없는(관련이있어도됨) 화면B에서 등록된 관찰자에게 편지를 보냅니다.

그럼 화면A의 관찰자는 미리 정해둔 행동을 하거나 편지내용을 갖고 화면A에 반영합니다.

보통 백그라운드 작업의 결과, 비동기 작업의 결과 등 현재 작업의 흐름과 다른 흐름의 작업으로부터 이벤트를 받을 때 사용합니다.

 

addObserver을 통해 우편함을 설치하고 post로 편지를 보냅니다.

같은 이름으로 여러개의 우채통을 만들어두면 post 한번으로 같은 이름의 우채통에 전부 들어갑니다.

 

출처 : https://silver-g-0114.tistory.com/106

 

 

 

간단한 예제를 통해 말씀드리겠습니다.

 

우선 시나리오는 다음과 같습니다.

1. 화면A에서 화면B로 이동을 합니다.

2. 이동전에 관찰자를 등록합니다.(편지를 받으면 내용을 공개할것, 편지를 받으면 그림에 색칠할 것)

3. 화면B에 도착하면 화면A에 편지를 보냅니다.

4. 화면A는 화면B에 편지를 받자마자 정해진 행동을 합니다.(화면B에서 행동함, 편지를 받으면 내용을 공개할것, 색칠할 것)

5. 화면B로 돌아옵니다.

6. 확인합니다.

 

- 화면A와  코드입니다.

화면A

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var image: UIImageView!
    @IBOutlet weak var text: UILabel!
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    @objc func changeImg(_ notification: Notification) {
        guard let letter = notification.object as? String else { return }
        guard let image = UIImage(systemName: "checkmark.seal.fill") else { return }
        self.text.text = letter
        self.image.image = image
    }

    @IBAction func goBVC(_ sender: Any) {
        guard let BviewController = self.storyboard?.instantiateViewController(identifier: "BViewController") as? BViewController else { return }
        //관찰자등록
        NotificationCenter.default.addObserver(
          self,
          selector: #selector(changeImg(_:)),
          name: NSNotification.Name("letter"),
          object: nil
        )
        self.navigationController?.pushViewController(BviewController, animated: false)
    }
    
}

 

 

- 화면 이동 버튼을 누르고 화면B로 이동합니다.

- 화면B와 코드입니다.

화면B

import UIKit

class BViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        NotificationCenter.default.post(
          name: NSNotification.Name("letter"),
          object: "편지받았다.",
          userInfo: nil
        )
    }
}

 

- 화면A로 돌아와 상태를 확인합니다.

돌아온 화면A

 

 

데이터 전달이 잘 되는것을 확인 할 수 있습니다.

 

추가로 관찰자를 실시간으로 등록해두면 메모리누수를 발생할 수 있기 때문에 항상 사용이 끝난 관찰자는 제거해두는 것이 좋습니다.

아래는 제거하는 코드입니다.

NotificationCenter.default.removeObserver(self)

 

이렇게 NotificationCenter에 대해 알아봤습니다.

 

오늘도 긴 글 읽어주셔서 감사합니다.

 

 

반응형