Search
Duplicate

NotificationCenter 동작 방식과 활용 방안에 대해 설명하시오.

Created
2023/10/15 02:24
Tags
iOS
태그

 면접 질문 : NotificationCenter 동작 방식과 활용 방안에 대해 설명하시오.

Notification

Notification Center를 통해 등록된 모든 옵저버에게 정보를 브로드캐스트(뿌려주는)하는 컨테이너이다.
등록된 Notification에 Notification Center를 통해 정보를 전달하기 위한 구조체

Notification 주요 프로퍼티

name : 알림을 식별하는 태그
var name: Notification.Name
Swift
복사
object: 발송자가 옵저버에게 보내려고 하는 객체. 주로 발송자 객체를 전달하는 데 쓰인다.
var object: Any?
Swift
복사
userInfo: Notification과 관련된 값 또는 객체의 저장소
var userInfo: [AnyHashable: Any]?
Swift
복사
특정 행동으로 인해 작업이 시작되거나 완료되는 시점에 다른 인스턴스로 Notification이 발생 시 필요한 데이터를 같이 넘겨줄 수 있다.
예를들어, 네트워킹을 이용하는 애플리케이션이라면 네트워킹이 시작 및 완료되는 시점, 음악 및 동영상 재생 등에도 재생이 끝나는 시점에 관련된 정보를 넘겨줄 수 있다.

NotificationCenter

등록된 옵저버에 정보를 브로드캐스트(뿌릴 수 있는) Notification 발송 메커니즘
등록된 옵저버에게 동시에 Notification을 전달하는 클래스이다.
NotificationCenter 클래스는 Notification을 발송하면 Notification Center에서 메세지를 전달할 Observer의 처리가 완료될 때가지 대기한다.
즉, 흐름이 동기적(synchronous)으로 흘러간다.
Notification을 비동기적(Asynchronous)으로 사용하려면 NotificationQueue를 사용하면 된다.
기본 NotificationCenter 얻기
default : 애플리케이션의 기본 NotificationCenter이다.
class var `default`: NotificationCenter { get }
Swift
복사
옵저버 추가 및 제거
addObserver(forName:object:queue:using:) : Notification을 Notification 대기열(Queue)과 대기열(Queue)에 추가할 블록(Swift의 Closure), Notification 이름을 Notification 센터의 메서드를 가리키는 장소(Dispatch Table)에 이름을 추가한다.
여기서 object에 특정 객체를 명시하면 명시한 객체가 발송한 Notification일 때에만 해당 이름의 Notification을 수신한다.
func addObserver { forName name: NSNotification.Name?, object obj: Any?, queue: OperationQueue? using block: @escaping (Notification) -> Void) -> NSObjectProtocol
Swift
복사
addObserver(_:selector:name:object) : Notification을 Notification 센터의 메서드를 가리키는 장소에 이름을 추가한다.
func addObserver { _ observer: Any, selector aSelector: Selector, name aName: NSNotification.Name? object anObject: Any?)
Swift
복사
removeObserver(_:name:object:) : Notification 센터의 메서드를 가리키는 장소에서 일치하는 이름을 제거한다.
func removeObserver { _ observer: Any, name aName: NSNotification.Name?, object anObject: Any?)
Swift
복사
Notification 발송
post(_:) : 지정된 Notification을 Notification 센터에 발송한다.
func post(_ notification: Notification)
Swift
복사
post(name:object:userInfo:) : 지정된 이름, 보낸 객체, 보낼 정보로 Notification을 만들어 Notification 센터에 발송한다.
func post { name aName: NSNotificaiton.Name, object anObject: Any?, userInfo aUserInfo: [AnyHashable: Any]? = nil)
Swift
복사
post(name:object:) : 지정된 이름, 보낸 객체로 Notification을 만들어 Notification 센터에 발송한다.
func post(name aName: NSNotification.Name, object anObject: Any?)
Swift
복사

객체간 소통 - Notification

iOS에서 객체들끼리 교신하는 대표적인 방법으로는 Callback, Notification, Delegate 이렇게 3가지가 있다.
객체 인스턴스를 만드는 방식도 있지만, 그것보다는 이 세 가지 방법이 더 효율적인 경우가 많다.

백단의 작업이 완료되는 순간 파악하기

프로그래밍과 관련된 중급 주제 중 가장 많이 다루어지는 것이 바로 Multi-threading과 Asynchronous Programming 이다.
멀티스레딩 : 여러 작업들이 동시(Concurrent)에 진행되는 것을 말하며, Async란 다른 작업을 기다리거나 방해하지 않고, 바로 자신의 작업을 진행하는 프로그래밍을 말한다.
Multi-threading 및 Async에서 중요한 것은 백단에서 돌고 있는 함수가 완료되는 순간을 니지하는 것이다.
예를들어, 용량이 큰 이미지를 불러오는 함수가 있다고 하면, 이 함수는 사용자 인터페이스 흐름을 막지 않기 위해 main queue가 아닌 global queue에서 Async(비동기적)으로 수행된다.
이때, 이미지 불러오기 작업이 완료되는 이벤트가 발생하면 이를 인지하고 작업을 처리해주어야 한다.
이러한 완료 이벤트 인지 작업과 관련하여 Swift에는 Callback, Notification, Delegate 3가지 방법이 존재한다.

Notification을 통해 인지하기

Notification한 객체가 다른 객체에 자신의 업데이트 상태를 알려주는 방법 중 하나이다.
방식은 instance-to-instance communication으로서 라디오 센터처럼 전파를 쏘아주는 구조로 이루어진다.
Notification을 통해 화면에 키보드가 나타나거나, 데이터 다운로딩이 완료되는 것과 같이 어떤 작업이 완료되거나 특정 이벤트가 발생할 경우, 이를 다른 객체들에게 알려줄 수 있다.
이러한 Notification은 프로그래밍 디자인 패턴 중 Observation 패턴 중 하나로서 MVC 구조에서 Model이 Controller에게 말을 걸기 위해 사용하는 방식이기도 하다.
Multi-threading 그리고 Async와 관련하여 백단에서 작업을 하는 인스턴스가 자신이 수행하는 작업을 완료하면 Notification을 통해 자신의 채널을 듣고 있는 인스턴스들에게 이를 통보할 수 있다.
Loop를 통해 변화가 있나 없나 계속 듣고 있어야 하기 때문에 Callback closure에 비해 자원적인 측면에서는 비효율적일 수도 있다.
그러나 한 객체의 변화를 여러 객체들이 관찰해야 하는 경우 등에서는 Notification 방식이 다른 방법보다 나을 수 있다.

Notification

여기서 말하는 Notification은 Push Notification과는 다른 의미이다.
Notification은 자신의 메세지를 받기로 한 가입객체에게 메세지를 보내게 된다. 이때 메세지를 보내는 객체는 자신의 가입객체에 대해 알 수 없고, 그저 메세지만 보내게 된다.
애플에서 직접 만든 코드 중 이 Notification이 활용되는 대표적인 사례는 앱에 키보드가 등장하는지 파악하거나, 홈버튼이 눌려 앱이 백그라운드로 이동했는지 파악하는 Notification을 꼽을 수 있다.

 요약

NotificationCenter란?

Observer(관찰자)에게 정보를 전달해주는 알림 발송 메커니즘

언제 Notification 센터를 사용?

앱 내에서 공식적인 연결이 없는 두 개 이상의 컴포넌트들이 상호작용이 필요할 때
상호작용이 반복적으로 그리고 지속적으로 이루어져야 할 때
일대다 또는 다대다 통신을 사용하는 경우

 reference