[Swift] 앱 안의 방송국 - Notification

Notification이란?

An object containing information broadcast to registered observers that bridges to Notification; use NSNotification when you need reference semantics or other Foundation-specific behavior.

  • Notification을 통해 등록된 observer들에게 전달될 정보를 포함하는 존재
  • 어떤 이벤트를 알리기 위한 역할
  • 이벤트에 관련된 메세지를 송출하면 앱 내에서 이 메세지를 받을 수 있다.

장단점

  • 장점
    • 메소드 간의 의존성을 줄인다.
    • 하나의 인스턴스가 동시에 여러 인스턴스에게 이벤트를 전달할 수 있다.
  • 단점
    • 코드가 분산이 돼서 추적하기 어려워진다.
    • 따라서 디버깅하기 어려워질 수 있다.



사용방법

1. 방송국과 방송 이름 만들기

    //방송국
    let notificationCenter: NotificationCenter = .default         
    //방송이름
    let didGameFinish: Notification.Name = Notification.Name("끝")

방송국을 만들 때 .default는 앱에서 전역적으로 사용될 수 있다는 의미

2. 방송을 받아서 전달하는 창구 역할의 메소드 만들기

    @objc
        func didRecieveGameFinish() {
            // 임무완료 후 이벤트를 알림 받음
            finishedGameCount = finishedGameCount + 1
        }

3. 방송이 뿌려지면 받을 것이라는 설정을 방송을 받는 메소드의 이니셜라이저를 통해서 한다. 마치 구독신청..

→ name이라는 방송이 송출이 되면 #selector에 쓰여져 있는 메소드를 통해서 나에게 알려줘!

    notificationCenter.addObserver(self, selector: #selector(didRecieveGameFinish),
    				name: didGameFinish, object: nil)
  • addObserver: 방송을 구독하겠다.
  • self: 내가 구독자(옵저버)가 되겠다.
  • selector: #selector(didRecieveDelivered): didRecieveDelivered라는 창구를 통해서 방송을 받겠다.
  • name: didGameFinish라는 방송을 받겠다.
  • object: 어떤 곳에서 발송요청 했을 때만 방송 듣겠다를 설정. 발송자를 명시한다. 만약 nil이라면 모든 발송자의 방송을 받겠다는 의미

4. 방송을 보낼 함수 내에서 필요 기능 실행을 끝낸 뒤 방송 송출을 요청한다.

    notificationCenter.post(name: didGameFinish, object: nil)
  • didGameFinish라는 방송을 해줘!
  • nil은 발송자의 정보를 숨기겠다는 의미. self로 한다면 내가 보낸다고 명시한다.

99. deinit을 통한 구독취소

notificationCenter.removeObserver(self)

좋은 웹페이지 즐겨찾기