サーチ…


前書き

iOS通知は、疎結合の方法でデータを送信する簡単で強力な方法です。つまり、通知を送信した人は、通知を受け取った人(誰でも)が気にする必要はありません。アプリの残りの部分に通知します。あなたのアプリの状態。

出典Swiftを使ったHACKING

パラメーター

パラメータ詳細
オブザーバーを登録する通知の名前。つまり、この名前の通知のみが操作キューにブロックを追加するために使用されます。 nilを渡すと、通知センターは通知の名前を使用してブロックを操作キューに追加するかどうかを決定しません。
オブジェクトオブザーバが受信したい通知を持つオブジェクト。つまり、この送信者によって送信された通知のみがオブザーバに配信されます。 nilを渡すと、ノーティフィケーションセンターは通知の送信者を使用してオブザーバに配信するかどうかを決定しません。
キューブロックを追加する操作キュー。 nilを渡すと、ブロックはポスティングスレッドで同期して実行されます。
ブロック通知を受け取ったときに実行されるブロック。ブロックは、オブザーバー登録が削除されるまで、通知センターおよびコピー(コピー)によってコピーされます。

備考

NSNotificationCenterオブジェクト(または単に通知センター)は、プログラム内で情報をブロードキャストするためのメカニズムを提供します。 NSNotificationCenterオブジェクトは基本的に通知ディスパッチテーブルです。

詳細については、Apple Documentationをご覧ください

SwiftのNSNotification&NSNotificationCenter

オブザーバーを追加する

命名規則

通知は、このように構成された名前を持つグローバル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