通知を投稿すると、すべての登録オブザーバーに通知されます。彼らは、メッセージを送信することで通知を受け取ります...セレクターによって識別されたものです。コメントで述べたように、使用しないviewDidLoad
でください。このことを考慮...
- (void)newDataNotification:(NSNotification *notification) {
// Do whatever you want to do when new data has arrived.
}
一部の初期のコード (viewDidLoad が適切な候補です):
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(newDataNotification:)
name:@"New data"
object:nil];
ところで、それはひどい名前です。しかたがない。この登録は、オブジェクトからの名前で通知が投稿されるたびに、オブジェクトself
にメッセージが送信されることを示しています。メッセージを受信するオブジェクトを制限したい場合は、nil 以外の値を指定してください。newDataNotification:
NSNotification
"New data"
これで、通知を送信するときに、コードで行ったように簡単に送信できます。
[[NSNotificationCenter defaultCenter] postNotificationName:@"New data" object:nil];
そして、それは(実用的な目的のために)それ[self newDataNotification:notification]
が呼び出されることを確認します。これで、通知とともにデータを送信することもできます。では、新しいデータが で表されるとしましょうnewDataObject
。任意のオブジェクトからの通知を受け入れるため、次のことができます。
[[NSNotificationCenter defaultCenter]
postNotificationName:@"New data"
object:newDataObject];
そして、あなたのハンドラーで:
- (void)newDataNotification:(NSNotification *notification) {
// Do whatever you want to do when new data has arrived.
// The new data is stored in the notification object
NewData *newDataObject = notification.object;
}
または、ユーザー情報ディクショナリでデータを渡すこともできます。
[[NSNotificationCenter defaultCenter]
postNotificationName:@"New data"
object:nil
userInfo:@{
someKey : someData,
anotherKey : moreData,
}];
次に、ハンドラーは次のようになります...
- (void)newDataNotification:(NSNotification *notification) {
// Do whatever you want to do when new data has arrived.
// The new data is stored in the notification user info
NSDictionary *newData = notification.userInfo;
}
もちろん、ブロック API でも同じことができます。
とにかく、オブザーバーを削除する必要があることに注意してください。がある場合はviewDidUnload
、そこに入れる必要があります。さらに、それがdealloc
同様に入っていることを確認してください:
- (void)dealloc {
// This will remove this object from all notifications
[[NSNotificationCenter defaultCenter] removeObserver:self];
}