LoginSignup
16
17

More than 5 years have passed since last update.

逆引きReactiveCocoa: NSNotificationのシグナルを終了させる

Last updated at Posted at 2014-05-11

ReactiveCocoaにはNSNotificationの通知をRACSignal化するサポートがあり、

[[[NSNotificationCenter defaultCenter]
    rac_addObserverForName:UIApplicationDidEnterBackgroundNotification object:nil]
    subscribeNext:^(NSNotification *note) {
        // do something
    }];

という形で通知をシグナルのnextとして受け取ることができます。

しかしこれには一点注意しなければならないことがあります。というのも、-rac_addObserverForName:object:で得られるシグナルはcompletedになることがない無限のシグナル (Infinite Signal) であり、その一方で通知のオブサーバー登録の解除はシグナルが終了した時にしかされないため、上記のようなコードだとオブサーバー登録が解除されないままになってしまいます。

通常、ViewControllerでオブサーバー登録・解除を行う場合、以下のようなパターンになると思いますが、

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(someMethod:) name:name object:nil];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

それと同じことをする場合は下記のようなコードになります。

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [[[[NSNotificationCenter defaultCenter]
        rac_addObserverForName:name object:nil]
        takeUntil:[self rac_signalForSelector:@selector(viewWillDisappear:)]]
        subscribeNext:^(NSNotification *note) {
            // do something
    }];
}

-takeUntil:に対して[self rac_signalForSelector:@selector(viewWillDisappear:)]とメソッド呼び出しに対応するシグナルを作用させることで、特定タイミングで元のシグナルを終了させ、結果的にオブサーバー登録が解除されるようになります。

16
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
17