🔹 Notification?
- observer들에게 전달되는 구조체로 정보가 담겨있고, 해당 알림을 등록한 observer에게만 전달됩니다. 구조체는 아래와 같이 구성되어 있습니다.
1️⃣ name : 전달하고자 하는 notification의 이름 (이걸 통해 알림을 식별)
2️⃣ object : 전달하고자 하는 데이터(객체) (없으면 nil)
3️⃣ userInfo : notification과 관련된 값 (없으면 nil) = extra data를 보내는데 사용 가능
🔹 NotificationCenter? (=NSNotificationCenter)
- notification이 오면 Observer Pattern을 통해서 등록된 observer들에게 notification을 전달하기 위해 사용하는 클래스입니다.
- NotificationCenter를 통해서 앱의 한 파트에서 다른 파트로 데이터를 전달할 수 있습니다.
- notification이 오면 등록된 observer list를 스캔합니다.
- NotificationCenter는 어플리케이션 어느 곳에서, 어느 객체와도 상호작용을 할 수 있습니다.
🔹 NotificationCenter에 Observer 등록하기
- notification을 observe 해주기 전에 NotificationCenter에 addObserver 과정을 무조건 먼저 거쳐줘야 원하는 신호를 관찰 가능하니까 주의하도록 합시다!
- addObserver가 있으면 removeObserver(_:name:object:)도 있는데 방식은 같습니다!
self 에서 "myNameNoti"라는 이름을 가진 notificaiton을 관찰할 것이고, 해당 notification이 발생하는 경우에 dataReceived라는 함수를 호출해 실행할 것이다. 라는 뜻입니다.
1️⃣ self : notification의 관찰자(observer)가 될 object
2️⃣ selector : notification이 오면 실행할 함수
3️⃣ name : notification의 이름
4️⃣ object : 지정하면 특정 sender로부터만 notification을 받음 (optional)
notification이 오면 실행해주는 함수는 target-action 패턴과 같은 형식으로 진행된다.
함수는 Notification 객체의 파라미터를 하나 갖게 된다.
‼️ Notification Name
추가적으로, name을 설정해줄 때
Notification.Name의 extension으로 따로 빼서 쓰면 더 유용하고 편하다.
🔹 NotificationCenter로 Post하기 (발송하기)
1️⃣ name : 전달하고자 하는 notification의 이름 (이걸 통해 알림을 식별)
2️⃣ object : addObserver의 object 부분과 목적이 동일한데, 특정 sender의 notification만 받고 싶은 경우에 작성해주면 됨 = filter 기능과 같달까? (없으면 nil)
3️⃣ userInfo : notification과 관련된 값 = extra data를 보내는데 사용 가능 (없으면 nil)
이때 userInfo의 타입은 위에서 말했다시피 [Anyhasable : Any] 이기 때문에 다운캐스팅해서 원하는 타입에 맞춰 작성해주면 된다.
🔹 NotificationCenter 언제 사용해?
1️⃣ 앱 내에서 공식적인 연결이 없는 두 개 이상의 컴포넌트들이 상호작용이 필요할 때
2️⃣ 상호작용이 반복적으로 그리고 지속적으로 이루어져야 할 때
3️⃣ 일대다 또는 다대다 통신을 사용하는 경우
그 다음 글은...
NotificationCenter를 사용한 데이터 전달 예제입니다.
많관부..!
🔗 참고자료 - https://learnappmaking.com/notification-center-how-to-swift/
➕ 혹시 코드 긁어보실 분은.. 긁으시라고..
NotificationCenter.default.addObserver(self, selector: #selector(dataReceived(_:)), name: Notification.Name("myNameNoti"), object: nil)
@objc func dataReceived(_ notification: Notification) {
// 실행해 줄 코드 ~
}
extension Notification.Name {
static let didReceiveData = Notification.Name("didReceiveData")
static let didCompleteTask = Notification.Name("didCompleteTask")
static let completedLengthyDownload = Notification.Name("completedLengthyDownload")
}
NotificationCenter.default.post(name: Notification.Name("myNameNoti"), object: nil)
'⭐️ 개발 > iOS & Swift' 카테고리의 다른 글
[iOS] TableView 최상단 cell, safeArea 무시하고 배치하는 법? (0) | 2021.08.02 |
---|---|
[iOS] 데이터 직접 전달 방식(4) - NotificationCenter을 통해 전달 (0) | 2021.07.29 |
[iOS] Moya가 모야? - Moya로 Get 통신하기 (10) | 2021.07.25 |
[iOS] TextView - 플레이스홀더, 패딩, 글자 수 제한, 커서, 키보드 dismiss (0) | 2021.07.22 |
[iOS] Alamofire Multipart/formdata를 통한 이미지 서버 통신 (3) | 2021.07.19 |