🍎 iOS/iOS 기본 & UIKit

[iOS/Swift] Notification Center

dev_zoe 2023. 4. 20. 01:47
반응형

노티피케이션 센터

https://developer.apple.com/documentation/foundation/notificationcenter

 

NotificationCenter | Apple Developer Documentation

A notification dispatch mechanism that enables the broadcast of information to registered observers.

developer.apple.com

노티피케이션 센터란, 등록된 관찰자에게 알려줄 수 있도록 하는 알림 메커니즘이다.
각 실행하고 있는 앱은 모두 기본적으로 노티피케이션 센터를 가지고으므로 해당 클래스를 이용하면 된다.

 

언제 활용하는가?

  • 앱 내에서 공식적인 연결이 없는 2개 이상의 컴포넌트 간 상호작용이 필요할 때 (ex: 스크린샷 감지될 때 뷰컨트롤러에서 Alert 띄워주기 / 앱이 백그라운드 -> 포그라운드 돌아왔을 때 Alert 띄워주기 등)

 

노피티케이션 센터 구조

 "default" 라는 기본 NotificationCenter를 기본적으로 가지고 있으며, 필요에 의해 따로 생성하는것도 가능하다.

 

1️⃣ func addObserver( forName name: NSNotification.Name?, object obj: Any?, queue: OperationQueue?,
    using block: @escaping @Sendable (Notification) -> Void) -> NSObjectProtocol

NotificationCenter에 Observer를 추가하는 메소드

 

- name : 등록한 알림의 이름 -> 이 이름을 가지는 Notification을 받으면 using에 있는 block이 실행됨

- obj : 옵저버에게 보내는 객체 -> 따로 보낼 객체가 없으면 nil을 명시해주면 됨

- queue : block이 실행될 오퍼레이션 큐를 지정해주는 것이며, nil일 경우에 Notification을 전달하는 발송자가 있는 스레드에서 block이 동시적으로 실행됨

 

func addObserver(_ observer: Any, selector aSelector: Selector, name aName: NSNotification.Name?, object anObject: Any?)

- observer : 관찰자 등록 -> 누가 관찰할것인지?

- selector : Observer가 notification을 수신하면 실행할 selector

 

2️⃣ func post(name aName: NSNotification.Name, object anObject: Any?, userInfo aUserInfo: [AnyHashable : Any]? = nil)

Notification.Name으로 Observer를 가지고 있는 객체 모두에게 Notification을 날림 (마치 방송국처럼!)

 

- name : 등록한 알림의 이름 -> Observer는 이 name의 Notification을 받으면 using에 있는 block을 실행함

- obj : 옵저버에게 보내는 객체

- userInfo : Notification에 딕셔너리 형태로 전달할 데이터

 

3️⃣ func removeObserver(_ observer: Any)

observer를 Dispatch 테이블로부터 제거해줌 -> 인자로 들어온 observer를 가지고 있는 객체가 없어짐과 동시에 더이상 notification을 받지 않도록 observer를 해제해주어야함

활용예시

✅ 앱이 포그라운드로 진입할 때 특정 뷰컨트롤러에서 데이터를 변화시키고 싶을 때

var observer: NSObjectProtocol?

override func viewDidLoad() {
	observer = NotificationCenter.default.addObserver(forName: UIApplication.didBecomeActiveNotification, object: nil, queue: .main) { [unowned self] _ in
            changeTitleAndCalendarDate()
    }
}

func changeTitleAndCalendarDate() {
	//날짜랑 캘린더 오늘 날짜로 바꾸기
}

deinit { //옵저버 해지 -> 메모리 관리
    if let observer = observer {
        NotificationCenter.default.removeObserver(observer)
    }
}

- 여기서 따로 post가 없는 이유는, didBecomeActiveNotification 자체가 active 상태일 때 이를 옵저빙 하고 있는 옵저버에게 notification을 post해주기 떄문이다!

 

+ 앱 생명주기 관련해서 기타 notification도 아래와 같이 있으니, 필요에 따라서 사용하면 좋을듯 하다.

✅ 키보드가 뷰를 가려서, 키보드 입력이라는 Notification을 전달받아 뷰를 조정하고 싶을 때

override func viewDidLoad() {
	 NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: UIResponder.keyboardWillShowNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: UIResponder.keyboardWillHideNotification, object: nil)
}

@objc
func keyboardWillShow(_ notification: Notification) { //keyboardFrameEndUserInfoKey : 키보드가 차지하는 frame의 CGRect값 반환
    if let keyboardFrame: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
        let keyboardRectangle = keyboardFrame.cgRectValue
        let keyboardHeight = keyboardRectangle.height
        chatBackGround.frame.origin.y -= (keyboardHeight - AppContext.shared.safeAreaInsets.bottom)
    }
    
    // y위치를 특정 위치만큼 올리기
}

@objc
func keyboardWillHide(_ notification: Notification) {
    if let keyboardFrame: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
        let keyboardRectangle = keyboardFrame.cgRectValue
        let keyboardHeight = keyboardRectangle.height
        chatBackGround.frame.origin.y += (keyboardHeight - AppContext.shared.safeAreaInsets.bottom)
    }
    // y위치를 특정 위치만큼 다시 내리기
}

 

기타 예시 : https://leeari95.tistory.com/49

 

[iOS/Swift] Notification, NotificationCenter

싱글턴 객체중 하나이므로 이벤트들의 발생 여부를 옵저버를 등록한 객체들에게 Notification을 post하는 방식으로 사용한다. Notification Name이라는 Key 값을 통해 보내고 받을 수 있다. 장점 많은 줄의

leeari95.tistory.com

 

반응형