iOS
NSNotificationCenter
サーチ…
前書き
iOS通知は、疎結合の方法でデータを送信する簡単で強力な方法です。つまり、通知を送信した人は、通知を受け取った人(誰でも)が気にする必要はありません。アプリの残りの部分に通知します。あなたのアプリの状態。
出典 : Swiftを使ったHACKING
パラメーター
パラメータ | 詳細 |
---|---|
名 | オブザーバーを登録する通知の名前。つまり、この名前の通知のみが操作キューにブロックを追加するために使用されます。 nilを渡すと、通知センターは通知の名前を使用してブロックを操作キューに追加するかどうかを決定しません。 |
オブジェクト | オブザーバが受信したい通知を持つオブジェクト。つまり、この送信者によって送信された通知のみがオブザーバに配信されます。 nilを渡すと、ノーティフィケーションセンターは通知の送信者を使用してオブザーバに配信するかどうかを決定しません。 |
キュー | ブロックを追加する操作キュー。 nilを渡すと、ブロックはポスティングスレッドで同期して実行されます。 |
ブロック | 通知を受け取ったときに実行されるブロック。ブロックは、オブザーバー登録が削除されるまで、通知センターおよびコピー(コピー)によってコピーされます。 |
備考
NSNotificationCenterオブジェクト(または単に通知センター)は、プログラム内で情報をブロードキャストするためのメカニズムを提供します。 NSNotificationCenterオブジェクトは基本的に通知ディスパッチテーブルです。
詳細については、Apple Documentationをご覧ください
オブザーバーを追加する
命名規則
通知は、このように構成された名前を持つグローバルNSStringオブジェクトによって識別されます。
Name of associated class
+ Did | Will
+ UniquePartOfName
+ Notification
例えば:
- NSApplicationDidBecomeActiveNotification
- NSWindowDidMiniaturizeNotification
- NSTextViewDidChangeSelectionNotification
- NSColorPanelColorDidChangeNotification
Swift 2.3
NSNotificationCenter.defaultCenter().addObserver(self,
selector: #selector(self.testNotification(_:)),
name: "TestNotification",
object: nil)
スウィフト3
NSNotificationCenter.default.addObserver(self,
selector: #selector(self.testNotification(_:)),
name: NSNotification.Name(rawValue: "TestNotification"),
object: nil)
目標-C
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(testNotification:)
name:@"TestNotification"
object:nil];
PS:オブザーバーが追加された回数は、オブザーバーが削除された回数と正確に一致する必要があります。新人のミスがでオブザーバを追加することですviewWillAppear:
のUIViewControllerのが、観察者の除去viewDidUnload:
プッシュの凹凸の数を引き起こし、観察者と余計な方法で呼び出さ取得通知セレクタをリークします。
オブザーバーの削除
Swift 2.3
//Remove observer for single notification
NSNotificationCenter.defaultCenter().removeObserver(self, name: "TestNotification", object: nil)
//Remove observer for all notifications
NotificationCenter.defaultCenter().removeObserver(self)
スウィフト3
//Remove observer for single notification
NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: "TestNotification"), object: nil)
//Remove observer for all notifications
NotificationCenter.default.removeObserver(self)
目標-C
//Remove observer for single notification
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"TestNotification" object:nil];
//Remove observer for all notifications
[[NSNotificationCenter defaultCenter] removeObserver:self];
通知の転記
迅速
NSNotificationCenter.defaultCenter().postNotificationName("TestNotification", object: self)
目標-C
[[NSNotificationCenter defaultCenter] postNotificationName:@"TestNotification" object:nil];
データによる通知の転記
迅速
let userInfo: [String: AnyObject] = ["someKey": myObject]
NSNotificationCenter.defaultCenter().postNotificationName("TestNotification", object: self, userInfo: userInfo)
目標-C
NSDictionary *userInfo = [NSDictionary dictionaryWithObject:myObject forKey:@"someKey"];
[[NSNotificationCenter defaultCenter] postNotificationName: @"TestNotification" object:nil userInfo:userInfo];
通知の観察
迅速
func testNotification(notification: NSNotification) {
let userInfo = notification.userInfo
let myObject: MyObject = userInfo["someKey"]
}
目標-C
- (void)testNotification:(NSNotification *)notification {
NSDictionary *userInfo = notification.userInfo;
MyObject *myObject = [userInfo objectForKey:@"someKey"];
}
ブロック付きオブザーバの追加/削除
オブザーバにセレクタを追加する代わりに、ブロックを使用することができます。
id testObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"TestNotification"
object:nil
queue:nil
usingBlock:^(NSNotification* notification) {
NSDictionary *userInfo = notification.userInfo;
MyObject *myObject = [userInfo objectForKey:@"someKey"];
}];
オブザーバは、次のようにして削除できます。
[[NSNotificationCenter defaultCenter] removeObserver:testObserver
name:@"TestNotification"
object:nil];
オブザーバーに名前を追加して削除する
// Add observer
let observer = NSNotificationCenter.defaultCenter().addObserverForName("nameOfTheNotification", object: nil, queue: nil) { (notification) in
// Do operations with the notification in this block
}
// Remove observer
NSNotificationCenter.defaultCenter().removeObserver(observer)
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow