728x90
반응형
안녕하세요! 개발하는 윤기사입니다!! 오늘은 저번 Delegate Pattern을 이용한 VC 사이의 값 전달에 대해서 포스팅해 드렸는데,
이번에는 NotificationCenter를 이용한 값 전달에 대해 포스팅하려고 합니다!
NotificationCenter을 이용하면 VC 간의 데이터 전달이 가능하다.
Observer가 코드 어딘가에서 서식하며 Notification 발생을 기다리는 개념이라고 생각하시면 됩니다.
즉, 이벤트들의 발생 여부를 Observer를 등록한 객체들에게 Notification을 보내는(POST) 방식으로 사용한다고 생각하시면 됩니다.
자세하게 한 번 알아보도록 하겠습니다!!
😎 Notification이 뭔데요?
- NotificationCenter를 통해 정보를 저장하기 위한 구조체입니다!
- Observer들에게 전달되는 구조체로 정보가 담겨있고, 해당 Notification을 등록한 Observer에게만 전달됩니다.
- name, object, userInfo로 이루어져 있습니다!
var name: Notification.Name //전달하고자 하는 Notification의 이름
var object: Any? //이벤트 발생 시 NotificationCenter를 통해 Observer에게 보내려고 하는 객체
userInfo: [AnyHashable : Any]? //notification과 관련된 값 또는 객체의 저장소
😎 Notification Center (NSNotificationCenter)
- Notification이 오면 Observer Pattern을 통해서 등록된 Observer들에게 Notification을 전달하기 위해 사용하는 클래스입니다.
- Notification을 발송하면 NotificationCenter에서 메시지를 전달한 Observer를 처리할 때까지 대기한다.
- Data Flow는 동기적(sync)으로 작동합니다.
- Notification Center를 통해서 VC에서 다른 VC로 데이터를 전달 가능.
- Notification이 오면 등록된 Observer 목록을 스캔.
- Notification Center는 App 어느 곳에서든 어느 객체와도 상호작용 가능.
🔥 Notification을 식별할 수 있는 Key(Name) 값이 필요하다.
// Notification Name 설정
extension Notification.Name {
static let developer = Notification.Name("Yun")
}
😎 NotificationCenter로 Post 하기 (발송하기)
- Post를 이용하여 Name 키 값 중 해당하는 코드를 실행하라고 시킵니다.
// Notification Post
NotificationCenter.default.post(name: Notification.Name.developer, object: nil, userInfo: [NotificationKey.devName: "개발하는 윤기사 블로그 많이 찾아주세요!!"])
- name : 전달하고자 하는 Notification의 이름
- object : 이벤트 발생 시 NotificationCenter를 통해 Observer에게 보내려고 하는 객체, filter 기능과 같이 특정 sender의 notification만 받고 싶은 경우 작성해 주면 됩니다. 없으면 nil을 작성해 주면 됩니다.
- userInfo : notification과 관련된 값 또는 객체의 저장소
⭐️ Notification Center에 Observer 등록하기
- Notification을 Observe 해주기 전에 NotificationCenter에 addObserver를 통해 해당 Key 값을 찾도록 설정해 줍니다.
- NotificationCenter에서 Post 한 Notification을 수신하고, 행동을 개시한다고 보면 됩니다.
// Notification Name(Key) 찾아서 행동 개시!
NotificationCenter.default.addObserver(self, selector: #selector(resultPost(notification:)), name: Notification.Name.developer, object: nil)
// addObserver를 통해서 행동할 내용!
@objc func resultPost(notification: Notification) {
//Notification.userInfo 값을 받아오기
guard let key = notification.userInfo?[NotificationKey.devName] as? String else { return }
print("\(key)")
}
- 반대로 removeObserver(_:name:object:)도 있습니다. Observer를 제거해 주는 것이지요!
💥 NotificationCenter는 언제, 왜 사용하나요?
- 앱 내에서 공식적인 연결이 없는 두 개 이상의 컴포넌트들이 상호작용이 필요할 때
- 상호작용이 반복적으로 그리고 지속적으로 이루어져야 할 때
- 일대다 또는 다대다 통신을 사용하는 경우 (Delegate Pattern과의 차이점을 생각해 보세요.)
장점
- 많은 줄의 코드가 필요 없이 쉽게 구현이 가능합니다.
- 다수의 객체들에게 동시에 이벤트의 발생을 알려줄 수도 있습니다!
- Notification과 관련된 정보를 Any? 타입의 object, [AnyHashable : Any]? 타입의 userInfo로 전달할 수 있다.
단점
- key 값으로 Notification의 이름과 userInfo를 서로 맞추기 때문에 컴파일 시 구독이 잘 되고 있는지, 올바르게 userInfo의 value를 받아오는지 확인이 어렵습니다 ㅠ.ㅠ
- Notification post 이후 정보를 받을 수 없습니다.
🌼 NotificationCenter 간단 세 줄 요약!!
1. NotificationCenter에서 Notification을 " post(발송) " 함으로써 이 Key(Name) 들을 공중에 뿌린다고 생각하면 됩니다.
2. 이 Key(Name)를 뿌리고, 해당 Key(Name)가 공중에 뿌려지면 기다리는 Observer가 포착합니다.
3. addObserver를 사용하여 맞는 특정 코드를 실행하는 것!
참고 :
728x90
반응형
'iOS_Swift 앱개발👍' 카테고리의 다른 글
[iOS_Swift] 로컬 푸시 알림 _ 32 (0) | 2023.07.27 |
---|---|
[iOS_Swift] WKWebView. 이 글 하나로 정리 끝. _ 31 (0) | 2023.07.25 |
[iOS_Swift] Delegate Pattern을 이용한 값 전달 _ 29 (0) | 2023.01.14 |
[iOS_Swift] RxSwift를 이용한 로그인 화면 만들기 _ 28 (3) | 2022.11.06 |
[iOS_Swift] Network in iOS (Github API 사용) _ 27 (2) | 2022.10.19 |