본문 바로가기

iOS/Swift - UIKit

[Swift] Notification Center 개념

Notification Center

개발자 문서

A notification dispatch mechanism that enables the broadcast of information to registered observers.

등록된 Observers에 정보의 전달을 허용하는 notification dispatch mechanism이다.

class NotificationCenter : NSObject

모든 객체들은 addObserver메서드를 이용하여 알림들(NSNotifcation Objects)을 받기 위해 notification center에 Observer로 등록할 수 있다.


객체를 observer로 등록하면, 그것이 받아야 하는 알림에 따라 구분된다.
그래서 하나의 객체에 여러 개의 다른 알림들을 받도록 만들기 위해 addObserver를 여러번 호출해줄 수도 있다.

 

앱들은 저마다의 default notification center를 가지는데, 특정 contexts에서 통신을 조직화하기 위해 새로운 notification center를 만들 수 있다.

 

다음으로, notification center는 단일 프로그램에서만 알림을 전달할 수 있다. 만약 알림을 다른 process에 전달하거나 받고 싶다면 DistributedNotifcationCenter를 대신 사용해야 한다.

default notification center

앱으로 보내진 모든 시스템 알림들은 default notification center에 보내진다. 우리는 커스텀한 알림도 여기에 보낼 수 있다. 알림의 종류는 OS에서 보낸 알림과 우리가 커스텀한 알림 두 가지로 나눌 수 있다. 익히 봐온 keyBoardDidChangeFrame, textDidBeginEditing도 OS에서 보낸 알림의 일종이다.

이미 존재하는 알림들의 이름을 알고 싶다면, 여기를 참고하면 된다!

 

만약 앱이 notifcaitons를 과도하게 사용하면, default notification center에만 알림을 보내기 보다는 커스텀 notification center를 만들어도 된다.

 

알림이 notification center에 전달되면, notification center는 리스트에서 등록된 옵저버들을 훑고 적절한 observer를 찾아내기 때문에 앱 전역적인 소통이 가능한 것이다.

 

그렇기에 알림들을 하나 또는 여러개의 centers를 구성하여 조직화하면, notification이 post될 때 더 적은 일 탐색이 수행되고, 앱 전반적인 성능을 향상시킬 수 있다.

알림을 보내는 방법

아래의 post 메서드를 통해서 알림을 생성하고, notification center로 발송할 수 있다.

func post(name aName: [NSNotification.Name], 
   object anObject: Any?, 
 userInfo aUserInfo: [AnyHashable : Any]? = nil)
  • aName의 경우 알림의 이름을 뜻하는데, 동일한 이름을 가진 Observer에 이벤트를 전달한다.
  • anObject는 알림을 보내는 객체를 말하는데, 특정 객체에서 보낸 알람만 사용하고 싶다면 쓰면 된다.
  • aUserInfo는 알림에 대한 부가적인 정보를 싣고 싶을 때 사용할 수 있는 딕셔너리 형태의 인자이다.
print(notification.object as? [String: Any] ?? [:])
print(notification.userInfo?["userInfo"] as? [String: Any] ?? [:]) }

위와 같이 object와 userInfo 모두 언래핑하여 사용할 수 있고, 동시에 사용할 수 있다.

 

Notification Center의 사용

  • 연결이 어려운 두 개 이상의 컴포넌트 사이의 데이터 전달이나 상호작용이 필요할 때
  • 상호작용이 연속적 또는 지속적으로 이루어져야 할 때
  • 일대다 또는 다대다 통신을 해야할 때