読者です 読者をやめる 読者になる 読者になる

pixyzehn blog

iPhone App, Mac App, Programming, Web service, Tool, Evernote, etc

NSNotification、NSNotificationCenterを使った通知

f:id:inagex:20140223180820p:plain


2つのオブジェクト間で、一方のオブジェクトでイベントが発生したときにもう一方のオブジェクトにメッセージを送る方法として使ってみます。


まずここでは1から2に任意のデータ(NSDictionary)を送ると仮定します。


まず送る側である1に以下のようにNSNotificationCenter にオブザーバとして登録します。

[[NSNotificationCenter defaultCenter] postNotificationName:@"notificationName"
                                                        object:self
                                                      userInfo:self.detailItem];


ここでは任意のデータ(NSDictionary)はself.detailItemとしてあります。



これは送りたい文字列などを配列にして突っ込んでおけばいいと思います。


続いて2の任意のデータを受け取る側の実装です。

    [[NSNotificationCenter defaultCenter] addObserverForName:@"notificationName"
                                                      object:nil
                                                       queue:[NSOperationQueue mainQueue]
                                                  usingBlock:^(NSNotification *note) {

                                                      NSDictionary *userInfo = note.userInfo;
                                                      NSURL* url = [NSURL URLWithString:userInfo[@"Item"][@"largeImageUrl"]];
                                                      NSData* data = [NSData dataWithContentsOfURL:url];
                                                      UIImage* img = [[UIImage alloc] initWithData:data];
                                                      [_objects addObject:img];

                                                      [self.collectionView reloadData];
                                                  }];


ここでは通知登録とハンドラの実装をblocksを使ったパターンでまとめることができ、そちらを使っています。


オブザーバー登録の解除の方法は以下です。

[[NSNotificationCenter defaultCenter] removeObserver:self];


まだNSNotificationを使ってみたばっかりですが、delegateなどよりもすごく簡単に2つのオブジェクト間のやりとりができるという印象です。