今回、あるViewControllerから別のViewControllerに処理を伝搬したいものがあり、
調べたところ、NotificationCenterを使えば実現できると知り実装しました。
今回はその実装方法について説明してみようと思います。
NotificationCenterって??
NotificationCenterは、異なるViewController間のイベント通知を実現できるもので、
発信側と受信側が存在します。
それぞれ、この通知が来たらこの処理をする!
この処理を実行したらあのViewControllerに処理をお願いする!
みたいなことが可能になります。
使い方
通知名前空間の拡張
まず、下記をどこかのファイルに記載してください。
拡張のため、どのファイルに書かないといけないみたいなことはありませんが、
あとから見返してわかる場所に書くことがベストだと思います。
extension Notification.Name {
static let notifyName = Notification.Name("notifyName")
}
通知を送りたい側
// 通知を送りたい箇所でこのように記述
NotificationCenter.default.post(name: .notifyName, object: nil)
通知を受け取りたい側
まずはじめに、受け取りたい側のVCでNotificationCenterを登録します。
こうすることで、notifyName通知が発行されたタイミングで、doSomething()が実行されるようになります。
override func viewDidLoad() {
super.viewDidLoad()
/// NotificationCenterを登録
NotificationCenter.default.addObserver(self, selector: #selector(doSomething(notification:)), name: .notifyName, object: nil)
}
注意点
NotificationCenterを登録しっぱなしでは、再度同じ画面を開いた場合、
登録が重複していってしまうため、画面から離れるタイミングでremoveObserverを実行することが重要です。
iOS9.0以降はremoveObserverが不要のようです。
コメントにてご指摘いただきました!
ありがとうございます。
参考サイト Apple公式ドキュメント
NotificationCenter.default.removeObserver(self)
さいごに
これはオブザーバーパターンといわれるもので、
MVVMを使用する場合、使用する頻度が高いんじゃないかなと思います。
値の受け渡しもできるので、私ももう少し勉強を進めていきたいと思います。
では!!