티스토리 뷰

안녕하세요?

너구리입니다ㅎㅎ

 

요즘 NotificationCenter 기능을 많이 쓰고 있어서

한번 정리해볼까 합니다ㅎㅎ

 

NotificationCenter란?


Notification + Center를 합친말 같은데..

Notification을 관리하는 Center란 뜻인가....?

 

이렇게 정의가 궁금할 땐 바로 공식문서를 뒤져봐야겠죠?

짠!!

해석을 해보면 등록된 옵저버에 정보(notification)를 전달하게 해주는 메커니즘 이라는 내용이네요ㅎㅎ

 

그럼 NotificationCenter에서 보내는 정보!

Notification은 뭘까요? 

이것도 공식문서에 친절히 설명되어 있습니다!

notification center를 통해 등록된 옵저버에 정보 컨테이너 라는 설명이네요!

 

그리고 notification을 구성하는 요소는 name, object, userInfo 인데요

해석해 보면 요렇게 되겠네요ㅎㅎ

 

name : notification의 이름

object : 보내고자 하는 옵저버

userInfo : 보내고 싶은 값이나 객체 저장소

 

notification과 center에 대해 알아보니까

계속 observer로 데이터를 보낸다는 이야기가 계속 나오고 있죠?

생각해보면 보내는건 알겠는데 어떻게 observer로 보낼까? 라는 생각이 들지 않나요?

 

감이 오신분들도 있을것 같은데요

먼저 addObserver()라는 메소드를 통해 

observer를 NotificationCenter에 등록해주어야 하고

등록후에 post()라는 메소드를 통해 등록된 observer로 정보나 이벤트를 보낼수 있습니다!!

(이건 아래에서 자세히 설명할게요!)

 

 

사용해보기 전 정의를 통해 대략적으로 정리해 보면

NotificationCenter는 observer를 등록하고 내가 보내고 싶은 정보나 객체를 담은 notification을 

원하는 옵저버로 보내는 기능을 전반적으로 관리하는 곳으로 이야기 할 수 있을 것 같아요!

 

아직 이해가 잘 안되신다구요?

 

 

 

NotificationCenter를 사용해보자!


정의를 살펴보았으니 한번 사용해 봐야겠죠?ㅎㅎ

저는 예제로 다음 화면(NextViewController)에서 처음 화면(ViewController)의 바탕화면색을 결정한 후

처음 화면으로 이동하여 바뀐 바탕색을 확인하는 과정을 구현해 보려고 합니다ㅎㅎ

바로 사용해볼게요~~!

 

 

1. Notification 이름 정하기

저는 notification 이름을 changeBackgroundColor로 정해주었어요

extension을 사용하여 정의하면 전역으로 사용할 수 있어요!!(꿀팁꿀팁)

 

2. NotificationCenter에 observer 등록하기

저는 처음화면(ViewController)에 옵저버를 등록해 주고

옵저버에 notification이 오면 changeBackground를 메소드가 수행되도록 정의해주었어요~

 

 

3. Notification 보내기(post)

데이터 전달은 object, userInfo 둘 다 전달할 수 있어요!

이번 예제에서는 object로 전달할게요!!

 

다음 화면(NextViewController)에서 버튼 클릭할 때

데이터를 전달하도록 구현해봤어요!!

 

자 여기까지 구현을 하면 기능이 정상 동작을 할거에요

풀 코드는 아래에 있으니까 참고하세요~~

 

 

// 처음 화면
class ViewController: UIViewController {
    
    @IBAction func moveToNextVC(_ sender: Any) {
        let vc = storyboard?.instantiateViewController(withIdentifier: "NextViewController") as! NextViewController
        self.navigationController?.pushViewController(vc, animated: true)
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 옵저버 등록
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(changeBackground(_:)),
                                               name: .changeBackgroundColor,
                                               object: nil)
        
    }
    // 옵저버로 신호가 올 경우 수행할 메소드(바탕화면 바꾸기 기능)
    @objc func changeBackground(_ notification: Notification) {
        if let color = notification.object as? UIColor {
            self.view.backgroundColor = color
        }
    }
}
// 다음 화면
class NextViewController: UIViewController {
    
    @IBAction func makeNextVCBlue(_ sender: Any) {
        // notification 보냄
        NotificationCenter.default.post(name: .changeBackgroundColor,
                                        object: UIColor.blue)
    }
    
    @IBAction func makeNextVCRed(_ sender: Any) {
        NotificationCenter.default.post(name: .changeBackgroundColor,
                                        object: UIColor.red)
    }
    
    @IBAction func makeNextVCGreen(_ sender: Any) {
        NotificationCenter.default.post(name: .changeBackgroundColor,
                                        object: UIColor.green)
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
    }


}

extension Notification.Name {
    // notification 이름 등록
    static let changeBackgroundColor = Notification.Name("changeBackgroundColor")
}

 

글 읽어 주셔서 감사합니다ㅎㅎ

안녕~~

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/03   »
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
글 보관함