通知センター - shirai/SwiftLearning GitHub Wiki
通知センタ
概論
目標
- NSNotificationについて概論を説明できる
わかったこと
NSNotification概要
- NSNotificationとは任意のオブジェクトに対して、メッセージを通知する仕組みである。
- 通知を受け取る側は、どんな通知を受け取りたいかをNSNotificationCenterに登録する必要がある。
- 登録にはNSNotificationCenterクラスの**「addObserver: selector: name: object:」**メソッドを使用する。
- 通知を送信する側は、NSNotificationCenterクラスの**「postNotification:」**メソッドを使用する。
- 通知を受け取る側は、どんな通知を受け取りたいかをNSNotificationCenterに登録する必要がある。
- 同じアプリの他のクラスで起こったイベントに対して、処理を実装したいときに使う
delegateとの違い
- 主にNSNotificationを使う場合
- 通知を受け取るオブジェクトが1つ以上ある
- 通知元がdelegateを配列で持つ必要が出てくるため
- やり取りが不要になったタイミングで配列からDelegateを取り除く必要がある
- 通知元オブジェクトと通知先オブジェクトの距離が遠い場合
- A>B>C>Dと行った形で上の階層参照する構造のViewがあった場合、DからAをdelegateで参照するには、Dからリレー形式でAを参照しなければならない
- Dの処理をCに委譲、Cの処理をBに委譲、Bの処理をAに委譲という形になる
- A>B>C>Dと行った形で上の階層参照する構造のViewがあった場合、DからAをdelegateで参照するには、Dからリレー形式でAを参照しなければならない
- 通知を受け取るオブジェクトが1つ以上ある
わからなかったこと
- 実際に複数処理を行うアプリの中で使ったことがないので、実際に使えるかがわからない
- 実際に使っていないため理解が浅い
- addObserverメソッドのobject引数の意味
つぎにやること
■調査 ■学習まとめに記載
通知と発行の受信
目標
- 通知を利用して、通知を発行し、受信することができる
わかったこと
実装手順
- 受け取り側
- NSNotificationCenter *インスタンス名 = [NSNotificationCenter defaultCenter]でNotificationCenterを取得
- [*インスタンス名 addObserver:self selector:メソッド名 name:@"通知名" object:nil]メソッドを使い通知を登録
- メソッドの実装
- 送信側
- NSNotification *インスタンス名 = [NSNotification notificationWithName:@"通知名" object:self userInfo:渡したいDictionary];を使い、通知を作成
- [[NSNotificationCenter defaultCenter]postNotification:インスタンス名];で通知を送信
サンプルコード
-
ボタンをタップするとViewが遷移し、遷移先のViewでボタンをタップすると遷移元に通知を送りLogにメッセージを表示される。
-
ViewController #import "ViewController.h" #import "SecondViewController.h"
@interface ViewController () - (IBAction)tapBtn:(id)sender; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // ここで通知を受け取るために、デフォルトの通知センターを取得 NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; // 通知センターに通知要求を登録 // notificationという名の通知があったときに、hoge:メソッドを呼び出すという登録を行っている [nc addObserver:self selector:@selector(hoge:) name:@"notification" object:nil]; } - (IBAction)tapBtn:(id)sender { SecondViewController *VC = [self.storyboard instantiateViewControllerWithIdentifier:@"toSecondViewController"]; [self presentViewController:VC animated:YES completion:nil]; } // 通知を引数に実行するメソッド - (void)hoge:(NSNotification *)notifi{ NSLog(@"%@",[notifi userInfo][@"key"]); } @end
-
SecondViewController
#import "SecondViewController.h" @interface SecondViewController () - (IBAction)tapBtn:(id)sender; @end @implementation SecondViewController - (IBAction)tapBtn:(id)sender { NSDictionary *dic = [NSDictionary dictionaryWithObject:@"Hallo!!" forKey:@"key"]; // notificationという名前の、dicという情報を持った通知を作成 // 渡せる情報はdictionary型の情報だけであり、useInfoに渡す NSNotification *noification = [NSNotification notificationWithName:@"notification" object:self userInfo:dic]; // 通知を発行 [[NSNotificationCenter defaultCenter]postNotification:noification]; } @end
わからなかったこと
- 実際に複数処理を行うアプリの中で使ったことがないので、実際に使えるかがわからない
つぎにやること
■実際に簡単なコードを書き実践 ■学習まとめに記載
参考
iOSアプリ開発におけるNotification(通知)の使い方 NSNotificationCenter-iPhoneアプリ開発の虎の巻 DelegateとNotificationの使い分け textFieldが隠れない!NSNotificationCenterの使い方その1