NotificationCenterの使い方 - enpitut2019/dj-yusaku GitHub Wiki

使い方

通知名前空間の拡張

  • まず通知の際に使うNotificationNameをどこかに記述しましょう。どこでもいいですがわかりやすい場所がいいと思います。あとクラス内に書くとエラーが吐かれるため注意しましょう。

extension Notification.Name {
    static let notifyName = Notification.Name("notifyName")
    // ここにこの開発で使うテンプレートの名前を記入してほしいです
}

通知を送る側

  • 通知を出したい場所(何かの動作が正常に終わった時など)にNotificationCenter.default.post()を記述しましょう。通知だけ送りたいときと何かしらの値を渡したいときで2パターンあります。

// 通知だけ送りたい場合
NotificationCenter.default.post(name: .notifyName, object: nil)

// userInfoに[AnyHashable : Any]?型を渡すことでオブジェクトをまたいで通知先に値を渡すことができます
NotificationCenter.default.post(name: .notifyName, object: nil, userInfo: ["title": title, "songID": songID])

通知を受け取る側

  • 通知を受け取りたいViewControllerではviewDidLoad()内でNotificationCenter.default.addObserver()を呼ぶことで通知を受け取れるようになります。
  • ViewController以外で通知を受け取りたい場合は、最初に呼ぶ関数を決めておいて(initialize()など)その中に記述してください。
  • selectorの引数に関数を指定すれば通知を受け取った際にその関数を実行します。ただしselectorに指定する関数はObjective-Cの関数でなければいけないため下記のように記述してください。

override func viewDidLoad() {
    super.viewDidLoad()
    /// NotificationCenterを登録
    NotificationCenter.default.addObserver(self, selector: #selector(doSomething), name: .notifyName, object: nil)
}

@objc func doSomething (notification: NSNotification) {
   guard let songID = notification.userInfo!["songID"] as? String else { return }
}

参考