정의
- Notification : Notification Center를 통해 등록된 모든 Observer(관찰자)에게 정보를 브로드캐스트(전달, 뿌려주는)하는 컨테이너
- NotificationCenter : 등록된 모든 Observer에게 정보를 전달하는 메커니즘, Key:Value로 구성
Notification
- 등록된 노티피케이션에 노티피케이션 센터를 통해 정보를 전달하기 위한 구조체.
Notification 주요 프로퍼티
- name : 알림을 식별하는 태그
var name: Notification.Name
- object : 발송자가 옵저버에게 보내려고 하는 객체, 주로 발송자 객체를 전달하는 데 사용
var objcet: Any?
- userInfo : 노티피케이션과 관련된 값, 또는 객체의 저장소
var userInfo: [AnyHashable:Any]?
NotificationCenter
- 등록된 옵저버에게 동시에 노티피케이션을 전달하는 클래스.
- NotifiactionCenter클래스는 Notification을 발송하면 NorificationCenter에서 메시지를 전달할 Observer의 처리가 완료될 때까지 대기한다.
- 흐름이 동기적으로 흘러가며, 비동기적으로 사용하려면 NotificationQueue를 사용하면 된다.
기본 NotificationCenter추가
- default : 애플리케이션의 기본 노티피케이션 센터
class var `default`: NotificationCenter {get}
옵저버 추가 및 제거
- addObserver(forName:object:queue:using:) : 노티피케이션을 대기열(Queue)과 대기열에 추가할 블록(Closure), 노티피케이션 이름을 노티피케이션 센터의 메서드를 가리키는 장소(Dispatch Table)에 이름을 추가한다. 여기서 object에 특정 객체를 명시하면 명시한 객체가 발송한 노티피케이션일 때에만 해당 이름의 노티피케이션을 수신한다.
func addObserver(
forName name: NSNotification.Name?,
object obj: Any?,
queue: OperationQueue?,
using block: @escaping (Notification) -> Void) -> NSObjectProtocol
- addObserver(_:selector:name:object:) : 노티피케이션을 노티피케이션 센터의 메서드를 가리키는 장소에 이름을 추가.
func addObserver(
_ observer: Any,
selector aSelector: Selector,
name aName: NSNotification.Name?
object anObject: Any?)
- removeObserver(_:name:object:) : 노티피케이션 센터의 메서드를 가리키는 장소에서 일치하는 이름을 제거.
func removeObserver(
_ observer: Any,
name aName: NSNotification.Name?,
object anObject: Any?)
- removeObserver(_:) : 노티피케이션 센터의 메서드를 가리키는 장소에서 모든 이름을 제거.
func removeObserver(_ observer: Any)
노티피케이션 발송
- post(_:) : 지정된 노티피케이션을 노티피케이션 센터에 발송.
func post(_ notification: NOtification)
- post(name:object:userInfo:) : 지정된 이름, 보낸 객체, 보낼 정보로 노티피케이션을 만들어 노티피케이션 센터의 발송.
func post(
name aName: NSNotification.Name,
object anObject: Any?,
userInfo aUserInfo: [AnyHashable : Any]? = nil)
- post(name:object:) : 지정된 이름, 보낸 객체로 노티피케이션을 만들어 노티피케이션 센터에 발송.
func post(name aName: NSNotification.Name, object anObject: Any?)
객체 간 소통
- iOS에서 객체들끼리 교신하는 대표적인 방법으로는 "Callback, Notification, Delegate" 3가지가 있습니다.
백그라운드에서 작업이 완료되는 순간 파악하기
종류
- Multi-threading : 여러 작업들이 동시에 진행되는 것.
- Asynchronous Programming(비동기): 다른 작업을 기다리거나 방해하지 않고 바로 자신의 작업을 진행하는 것.
함수가 완료되는 순간
- Multi-threading과 Async에서는 진행 중인 작업이 완료되는 순간을 인지하고 작업을 처리해주는 것이 중요한데, 이러한 완료 이벤트 인지 작업을 위한 방법이 "Callback, Notification, Delegate"입니다.
Notification을 통해 인지하기
- Notification은 한 객체가 다른 객체에 자신의 업데이트 상태를 알려주는 방법 중 하나입니다.
- instance-to-instance communication으로 라디오 센터처럼 전파를 쏘아주는 구조로 이루어집니다.
- 프로그래밍 디자인 패턴 중 Observation 패턴 중 하나로 MVC 구조에서 Model이 Controller에게 말을 걸기 위해 사용하는 방식이기도 합니다.
- 작업이 완료된 인지 알림을 Notification을 통해 할 수 있지만, 다른 방법에 비해 비효율적일 수 있습니다. 하지만 한 객체의 변화를 여러 객체들이 관찰해야 하는 경우에는 Notification방식이 효과적일 수 있습니다.
NotificationCenter 동작 방식
1, 객체 A(수신자)는 객체 B(송신자)의 어떠한 행위를 관찰하기 위해 NotificationCenter에 옵저버를 등록한다.
- 옵저버에는 어떤 객체를 관찰할 것인지, 어떤 행위를 관찰할 것인지, 등, 다양한 정보가 저장됨.
2, 객체 A가 어떠한 행위를 한다.
3, 객체 A는 알림을 생성하고, Notification Center에 Post 함.
4, NotificationCenter는 객체 B에게 등록한 옵저버에 대한 알림이 발생했다고 알림.
활용 방안
- 대용량 파일을 다운로드하는 스레드를 생성하고 다른 페이지로 이동해도 다운로드 진행, 다른 작업 진행 중 대용량 파일 다운로드 완료되면 알림 팝업 띄우기
- 네트워킹을 이용하는 앱에서 네트워킹이 시작 및 완료되는 시점, 음악 및 동영상과 같은 미디어 플레이의 재생이 끝나는 시점을 알림으로 알려주기
- 앱에 키보드가 등장하는지 파악하기
- 홈버튼이 눌려 앱이 백그라운드로 이동했는지 파악하기
내용 출처
https://vincentgeranium.github.io/ios,/swift/2020/05/31/iOS-QnA-Summary-1.html
'iOS > iOS' 카테고리의 다른 글
prepareForReuse (0) | 2022.04.08 |
---|---|
Class의 성능을 향상 시킬 수 있는 방법들을 나열해보시오. (0) | 2022.04.07 |
OOP, FP (0) | 2022.04.05 |
멀티 스레드(Multi Thread) 구현 시, 고려할 수 있는 방식 (0) | 2022.04.01 |
String은 왜 subscript로 접근이 안되는가? (0) | 2022.03.30 |
댓글