노티피케이션 센터
https://developer.apple.com/documentation/foundation/notificationcenter
노티피케이션 센터란, 등록된 관찰자에게 알려줄 수 있도록 하는 알림 메커니즘이다.
각 실행하고 있는 앱은 모두 기본적으로 노티피케이션 센터를 가지고으므로 해당 클래스를 이용하면 된다.
언제 활용하는가?
- 앱 내에서 공식적인 연결이 없는 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 > iOS 기본 & UIKit' 카테고리의 다른 글
[iOS/UIKit] UITableView, UICollectionView 다시 살펴보기 (0) | 2023.05.22 |
---|---|
[iOS] 뷰 컨트롤러 생명주기 / 앱 생명주기 (0) | 2021.09.09 |
[iOS] Swift에서 데이터를 전달하는 방법 (0) | 2021.09.07 |
[iOS] AppDelegate, SceneDelegate (+UIWindow, UIScene, UIWindowScene) (0) | 2021.09.07 |
[iOS] 프로젝트 속성 조사 (PROJECT, TARGETS) (0) | 2021.08.31 |