通知センター - shirai/SwiftLearning GitHub Wiki

通知センタ

概論

目標

  • NSNotificationについて概論を説明できる

わかったこと

NSNotification概要

  • NSNotificationとは任意のオブジェクトに対して、メッセージを通知する仕組みである。
    • 通知を受け取る側は、どんな通知を受け取りたいかをNSNotificationCenterに登録する必要がある。
      • 登録にはNSNotificationCenterクラスの**「addObserver: selector: name: object:」**メソッドを使用する。
    • 通知を送信する側は、NSNotificationCenterクラスの**「postNotification:」**メソッドを使用する。
  • 同じアプリの他のクラスで起こったイベントに対して、処理を実装したいときに使う

delegateとの違い

  • 主にNSNotificationを使う場合
    • 通知を受け取るオブジェクトが1つ以上ある
      • 通知元がdelegateを配列で持つ必要が出てくるため
      • やり取りが不要になったタイミングで配列からDelegateを取り除く必要がある
    • 通知元オブジェクトと通知先オブジェクトの距離が遠い場合
      • A>B>C>Dと行った形で上の階層参照する構造のViewがあった場合、DからAをdelegateで参照するには、Dからリレー形式でAを参照しなければならない
        • Dの処理をCに委譲、Cの処理をBに委譲、Bの処理をAに委譲という形になる

わからなかったこと

  • 実際に複数処理を行うアプリの中で使ったことがないので、実際に使えるかがわからない
    • 実際に使っていないため理解が浅い
  • addObserverメソッドのobject引数の意味

つぎにやること

■調査 ■学習まとめに記載

通知と発行の受信

目標

  • 通知を利用して、通知を発行し、受信することができる

わかったこと

実装手順

  • 受け取り側
  1. NSNotificationCenter *インスタンス名 = [NSNotificationCenter defaultCenter]でNotificationCenterを取得
  2. [*インスタンス名 addObserver:self selector:メソッド名 name:@"通知名" object:nil]メソッドを使い通知を登録
  3. メソッドの実装
  • 送信側
  1. NSNotification *インスタンス名 = [NSNotification notificationWithName:@"通知名" object:self userInfo:渡したいDictionary];を使い、通知を作成
  2. [[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