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:)]
とメソッド呼び出しに対応するシグナルを作用させることで、特定タイミングで元のシグナルを終了させ、結果的にオブサーバー登録が解除されるようになります。