Swift 3의 NotificationCenter 사용방법

2016-12-27
24 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

모바일 앱 아키텍처
Swift
shares1 views
Swift
shares1 views

모바일 앱 아키텍처

MJ Kim - 4월 22, 2017

이 내용은 나름대로 개발해본 내용을 토대로 정리해본 모바일 앱 아키텍처에 대한 내용이다. 이를 정리한 이유는 오래된 아키텍처부터 최근 아키텍처까지 정리해보고…

시간차를 얻는 Date Extension
Swift 3.0
shares4 views
Swift 3.0
shares4 views

시간차를 얻는 Date Extension

MJ Kim - 4월 12, 2017

사용자가 남길 내용에 대한 시간표시를 할 때 일정한 시간차를 표현해주는 경우가 있어 이에 대한 Date Extention을 정리해 보았다. [crayon-58fabf596cdd0247666522/]  

Swift 3.1에서 없어진 문법 정리
Swift 3.0
shares31 views
Swift 3.0
shares31 views

Swift 3.1에서 없어진 문법 정리

MJ Kim - 3월 31, 2017

Swift언어는 무엇인가 나올때마다 없어지는 것들이 있어, Swift 3.1에서 컴파일할 수 없게 된 문법내용을 정리했다. switch문을 사용하여 enum에서 protocol을 여러가지 패턴으로…