4T2F / ThinkBig

🌟씽크빅 스터디🌟
5 stars 1 forks source link

NotificationCenter 란 무엇이고 어떻게 사용하는것일까요? #44

Open Hsungjin opened 6 months ago

Hsungjin commented 5 months ago

Intro

들어가기 앞서 저는 NotificationCenter를 우체국이라고 가정하고 들어갈게요.

우리가 편지를 우체통에 넣으면 어떻게 될까요?

그 과정에 NotificationCenter 와 매우 흡사합니다.


What is NotificationCenter?

NotificationCenter

  1. addObserver : 우체부는 우체국에게 '제가 00동으로 가는 우체부입니다'라고 등록을 합니다.

  2. Something Happen : 서울의 황성진은 고향의 친구에게 보낼 편지를 썼습니다.

  3. post : 황성진은 우체국에 편지를 보냈습니다.

  4. notify : 우체국은 00동에 가는 우체부에게 편지가 왔다고 전달해줍니다.

  5. selector : 우체부가 고향의 친구에게 갈 편지를 배송해줍니다.

기본적인 NotificationCenter 이 작동하는 방식이다.

더 자세히 NotificationCenter 에 대해서 자세히 알아보기전에 사용되는 용어가 여러가지가 있는데 우선 용어 정리부터 해보자.

NotificationCenter(우체국)

Observer

Post

Notification

NotificationName


언제 사용하는게 좋을까?

구현해보기

Notification Center로 Post 하기

    func notificate(writeText: String) {
        NotificationCenter.default.post(name: Notification.Name("writeText"), object: nil, userInfo: ["myWriting": writeText])
    }


Notification Center에 Observer 등록하기

// Notification Name 설정
 NotificationCenter.default.addObserver(self, selector: #selector(receiveNoti), name: Notification.Name("writeText"), object: nil)


Observer가 실행할 함수 만들기

 @objc func receiveNoti(notification: Notification) {
        guard let writeText = notification.userInfo?["myWriting"] as? String else { return }
        showField.text = writeText
}


Observer 제거하기

NotificationCenter.default.removeObserver(self)

전체코드

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var writeField: UITextField!
    @IBOutlet weak var showField: UITextView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    func notificate(writeText: String) {
        NotificationCenter.default.post(name: Notification.Name("writeText"), object: nil, userInfo: ["myWriting": writeText])
    }

    @objc func receiveNoti(notification: Notification) {
        guard let writeText = notification.userInfo?["myWriting"] as? String else { return }
        showField.text = writeText
    }

    @IBAction func sendButtonTapped(_ sender: UIButton) {
        NotificationCenter.default.addObserver(self, selector: #selector(receiveNoti), name: Notification.Name("writeText"), object: nil)
        guard let writeText = writeField.text else { return }
        notificate(writeText: writeText)
        NotificationCenter.default.removeObserver(self)
    }

}


NotificationCenter 활용 시 고려해야 할 사항





정리

NotificationCenter는 iOS 앱에서 컴포넌트 간의 결합도를 낮추면서도 효과적으로 데이터를 전달하고 이벤트를 처리할 수 있는 강력한 도구입니다. 그러나 이를 사용할 때는 메모리 관리, 성능, 스레드 안전성 등을 주의 깊게 고려해야 합니다. 또한, NotificationCenter의 사용은 필요한 경우에 한해 최소화하여 앱의 유지보수성과 성능을 극대화하는 것이 좋습니다.


ha-nabi commented 5 months ago

1대 다수의 통신을 사용하는 경우엔 NotificationCenter를, 1대 1의 통신을 사용하는 경우엔 FCM을 사용하면 되는걸로 이해하면 될까요?