Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
NotificationCenter
Swiftの『NotificationCenter』は、オブジェクト間でイベントを通知するpub/subパターンの仕組みです。直接の参照を持たない部品間でも通信できます。
メソッド一覧
| メソッド | 概要 |
|---|---|
| NotificationCenter.default | デフォルトの NotificationCenter インスタンスです。 |
| post(name:object:userInfo:) | 通知を送信します。 |
| addObserver(_:selector:name:object:) | 通知を受け取るオブザーバーを登録します(Objective-C スタイル)。 |
| addObserver(forName:object:queue:using:) | クロージャで通知を受け取るオブザーバーを登録します。 |
| removeObserver(_:) | オブザーバーの登録を解除します。 |
| Notification.Name | 通知の識別子を定義する構造体です。 |
サンプルコード
import Foundation
// カスタム通知名の定義
extension Notification.Name {
static let userDidLogin = Notification.Name("userDidLogin")
static let dataDidRefresh = Notification.Name("dataDidRefresh")
}
// クロージャで通知を受け取る
let observer1 = NotificationCenter.default.addObserver(
forName: .userDidLogin,
object: nil,
queue: .main
) { notification in
let userName = notification.userInfo?["name"] as? String ?? "不明"
print("ログイン通知受信: \(userName)")
}
let observer2 = NotificationCenter.default.addObserver(
forName: .dataDidRefresh,
object: nil,
queue: .main
) { _ in
print("データ更新通知受信")
}
// 通知の送信(userInfo でデータを添付できる)
NotificationCenter.default.post(
name: .userDidLogin,
object: nil,
userInfo: ["name": "Alice", "timestamp": Date()]
)
NotificationCenter.default.post(name: .dataDidRefresh, object: nil)
// 複数回通知
NotificationCenter.default.post(
name: .userDidLogin,
object: nil,
userInfo: ["name": "Bob"]
)
// オブザーバーの解除(メモリリーク防止のため必ず解除する)
NotificationCenter.default.removeObserver(observer1)
NotificationCenter.default.removeObserver(observer2)
// 解除後は通知が届かない
NotificationCenter.default.post(
name: .userDidLogin,
object: nil,
userInfo: ["name": "Carol"]
)
print("解除後は通知が届きません")
// システム通知の受信例
let appObserver = NotificationCenter.default.addObserver(
forName: NSNotification.Name("NSApplicationDidBecomeActiveNotification"),
object: nil,
queue: .main
) { _ in
print("アプリがアクティブになりました")
}
概要
NotificationCenter は画面間・モジュール間の疎結合な通信に適しています。送信側と受信側が互いを知らなくても通知を送受信できます。
『addObserver(forName:object:queue:using:)』は戻り値のオブザーバートークンを必ず変数に保持してください。オブザーバーを解除しないとメモリリークや意図しない通知受信が発生します。deinit やビューの非表示タイミングで必ず removeObserver を呼んでください。
Timer によるタイマー処理についてはTimerを参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。