NotificationのObserverを使ってみる(1)

NotificationCenterとObserverは便利だなー
と思いメモ書き

# １、NSNotificationCenterに取得について
デフォルトに用意されているdefaultCenterというのがあります
以下の書き方で取得できます。
```
[NSNotificationCenter defaultCenter]
```

※そもそもNotificationCenterが何かはわからない場合はこちら
[Apple - NSNotificationCenter Class Reference](https://developer.apple.com/reference/foundation/nsnotificationcenter)
[iPhoneアプリ開発の虎の巻 - NSNotificationCenter](http://iphone-tora.sakura.ne.jp/nsnotificationcenter.html)

# 2、NSNotificationCenterに登録前準備
通知を受け取った際に動かしたい処理を登録します
ここでは簡単に・・・

```ViewController.m
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];

}

/* 通知を送るアクション-----------*/
- (IBAction)buttonTapped:(id)sender {
    
}

/* 動かしたい処理----------------*/
-(void)hello
{
    NSLog(@"Hello");
}
@end
```
ボタンアクションと動かしたいメソッドの -(void)helloを用意しておきます。

# ３、通知を「受け取る」処理の登録
NSNotificationCenterにObserverを登録します

```ViewController.m
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    /* 通知を「受け取る」処理の登録----------------*/
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(hello)
                                                 name:@"Hello"
                                               object:nil];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];

}

/* 通知を送るアクション-----------*/
- (IBAction)buttonTapped:(id)sender {
    
}

/* 動かしたい処理----------------*/
-(void)hello
{
    NSLog(@"Hello");
}

@end
```

`addObserver:対象オブジェクト [viewやcellなどを対象にできるが基本はself]`
`selector:メソッド [動かしたい処理]`
`name:通知名 [他の処理で通知された時に着火するためのもの]`
`object:渡したいもの [データやオブジェクト]`

# ４、通知を「送る」処理の追加
通知を受け取れるようにしたので、次は通知を送る処理です

```ViewController.m
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    /* 通知を「受け取る」処理の登録----------------*/
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(hello)
                                                 name:@"Hello"
                                               object:nil];

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];

}

/* 通知を送るアクション-----------*/
- (IBAction)buttonTapped:(id)sender {
    
    /* 通知を送る*/
    [[NSNotificationCenter defaultCenter] postNotificationName:@"Hello"
                                                        object:nil];
}

/* 動かしたい処理----------------*/
-(void)hello
{
    NSLog(@"Hello");
}

@end
```

# 動作確認
![notification.gif](https://qiita-image-store.s3.amazonaws.com/0/8109/4572ea4e-c66c-bc72-7621-868249d2019a.gif)

以上、簡単でしたがこんな感じです。
違う遷移時や別クラスの処理から呼び出したい時は
簡単かつ便利なので使い勝手いいですね。

**・・・と忘れてはいけないのが！**

# 通知登録の削除

```ViewController.m
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    /* 通知を「受け取る」処理の登録----------------*/
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(hello)
                                                 name:@"Hello"
                                               object:nil];

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];

}

/* 通知を送るアクション-----------*/
- (IBAction)buttonTapped:(id)sender {
    [[NSNotificationCenter defaultCenter] postNotificationName:@"Hello"
                                                        object:nil];
}

/* 動かしたい処理----------------*/
-(void)hello
{
    NSLog(@"Hello");
}

/* 登録した通知登録の削除----------------*/
- (void)deallo
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

@end
```

（そもそも実装時によく削除処理を忘れてしまうから、忘れないようにとわざわざ記事を書いていたのに、書いてる途中にも忘れそうになりましわ^^;）

**「基本的に通知イベントは登録と解除する処理を一緒に入れないといけません」**