Swift 3의 NotificationCenter 사용방법

2016-12-27
12 Views

Swift 3.0이상에서 사용되는 NotificationCenter가 많은 개선이 이루어졌는데 이를 잘 활용하지 못한 경우가 많아서 나름대로 정리해보았다.일단 아래와 같은 클래스를 준비하고 그것을 기반으로 설명한다.

이미 준비되어 있는 알림을 이용할 경우

UIApplicationDidBecomeActiveNotification(앱이 활성화될 때 호출됨) 타이밍에서 자신의 notified(notification:) 메소드가 호출되도록 할 경우 Swift 2.x때까지는 아래와 같이 코딩했다.

Swift 3.0에서 ‘UIApplicationDidBecomeActiveNotification’ has been renamed to ‘NSNotification.Name.UIApplicationDidBecomeActive’라는 컴파일 오류 메시지와 같이 수정사항이 나오기 때문에 이를 아래와 같이 수정해야 한다.

위와 같은 코드도 문제가 없지만 NSNotification.Name 부분도 형추론을 통해 생략이 가능하다.

개발자별 차이가 도있겠지만 간결하게 작성하는 것을 추천하고 싶다. NSNotification.Name.UIApplicationDidBecomeActive가 무엇인가를 정의한다면 NSNotification.Name형의 값을 말한다.

추가적으로 폐쇄로 코딩한다면, notified(notification:)메소드를 제공하지 않고 다음과 같이 코딩할 수 있다.

또한 notified(notification:)메소드를 준비하면서 아래와 같이 사용할 수 있다.

새로운 알림을 이용하는 경우

Swift 2.x까지는 아래와 같은 형태로 작성했다.

이를 Xcode의 마이그레이션지원에 따라 다음과 같이 컴파일이 되는 코드이다.

그렇지만 Swift 3.0의 좋은 장점을 이용할 수 없게 되기 때문에 Swift 2.x이전에는 모든 문자열 변수나 문자열 리터럴을 그대로 name파라미터에 주어진 것이 Swift 3.0에서는 NSNotification.Name형을 받아서 변경하는데 일일이 rawValue에서 문자열을 전달하고 있으면의미가 없다. 아래와 같이 따로 정의한 myNotification을 NSNotification.Name형으로 처리하면 좋다.

이 코드도 좋지만 NSNotification.Name.UIApplicationDidBecomeActive등 원래 준비되어 있는 것만 아니라 다음과 같이 정의해보면 좋을 것 같다.

또한 다음과같이 struct등으로 구분하여 원래 준비되어 있는 것으로 구별하는 것도 가능한데 생략한다.

알림 발행 방법

이것은 크게 달라진 것은 없지만 NSNotification.Name.myNotification을 사용하여 발행한다.

알림 등록 해제 방법

다음과같은 방법으로 기본적으로 등록을 했으면 알맞게 해제하자.

addObserver(forName:object:queue:using:)을 사용한 경우 해제 패턴

addObserver(forName:object:queue:using:)사용하면 알림 해제시 리턴을 NSObjectProtocol형의 객체를 가지고 그것을 원래대로 removeObserver(_:)을 호출할 필요가 있다는 것을 주의하자. 리턴값을 사용하지 않으면 경고가 나오기 때문에 이를 빼고 처리하기 어렵다.

한번만 알림을 받고 싶은 경우

userInfo가 [AnyHashable: Any]? 형의 문제

아직은 애매한 부분이 있지만 notification객체에 userInfo가 있는 정보만 부여할 수 있지만 그것이 [AnyHashable: Any]?형이기 때문에 좀 사용하기 어렵다.

다양한 방법이 있는데,

  • userInfo가 [AnyHashable: Any]?형임을 허용하면서 조심스럽게 사용
  • userInfo에 의존하지 않음
  • 라이브러리르 사용하여 해결함

 

NotificationCenter는 특정 알림을 감지하는 것에 사용하여 받는 쪽에서 핸들링은 받는 쪽이 접근할 수 있는 정보를 보여준다는 형태로 설계하고 있다.

Facebook Comments

You may be interested

Xcode 기능 확장(Extension) 제거하기
Xcode
shares3 views
Xcode
shares3 views

Xcode 기능 확장(Extension) 제거하기

MJ Kim - 3월 18, 2017

Mac에서 Xcode Source Editor Extension등의 기능확장을 사용하다보면 디버깅시 시스템 환경 설정의 확장이 앱에 등록되는 경우가 있다. 계속해서 목록이 남아 있기…

iOS App Store Review(앱 심사약관) 번역
Swift 3.0
shares112 views
Swift 3.0
shares112 views

iOS App Store Review(앱 심사약관) 번역

MJ Kim - 3월 15, 2017

App Store Review를 번역했다. 사실 이번에 좀 애매한 리젝을 당해서 그걸 이해하고자 정리해본다. 원문링크: https://developer.apple.com/app-store/review/guidelines/ 1. 이약관은? 1.1 앱 개발자로서 프로그램의…

Raspberry Pi 타이머 On/Off 전원제어모듈 RPi1114-Raspberry Pi
IoT by Raspberry Pi
shares7 views
IoT by Raspberry Pi
shares7 views

Raspberry Pi 타이머 On/Off 전원제어모듈 RPi1114-Raspberry Pi

MJ Kim - 3월 04, 2017

RPi1114-Raspberry Pi전원제어 모듈이 있다. 이 제품은 40Pin GPIO핀헤더에 연결하여 사용하는 모듈로 Cortax-M0마이크로컨트롤러 LPC1114를 내장하고 Raspberry Pi의 시작과 정지 순서등을 프로그래밍할…