Swift 3의 NotificationCenter 사용방법

0

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

No more articles