ios - Cómo utilizar el Cacao Reactivo con notificaciones.
reactive-cocoa (3)
¿Cómo puedo crear una señal de un nombre de notificación? Por ejemplo, quiero ir desde:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(userDidChange:)
name:kTTCurrentUserLoggedOffNotification
object:nil];
a algo como:
[signalForName(kTTCurrentUserLoggedOffNotification) subscribeNext:^(id x){
...
}];
En las RACExtensions puede encontrar la categoría NSNotificationCenter (RACSupport)
. Eso tiene un método para este propósito:
- (RACSignal *)rac_addObserverForName:(NSString *)notificationName
object:(id)object;
Versión Swift
utilizando ReactiveCocoa 4.1
:
NSNotificationCenter.defaultCenter()
.rac_addObserverForName(UIKeyboardWillShowNotification, object: nil)
.takeUntil(self.rac_willDeallocSignal())
.subscribeNext { (_) in
print("UIKeyboardWillShowNotification")
}
-[NSNotificationCenter rac_addObserverForName:object:]
devuelve una señal infinita. Puedes suscribirte de esta forma.
C objetivo
[[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIApplicationDidEnterBackgroundNotification object:nil]
takeUntil:[self rac_willDeallocSignal]]
subscribeNext:^(id x) {
NSLog(@"Notification received");
}];
Rápido
NSNotificationCenter.defaultCenter()
.rac_addObserverForName(UIKeyboardWillShowNotification, object: nil)
.takeUntil(self.rac_willDeallocSignal())
.subscribeNext { (_) in
print("Notification received")
}
Esta señal es como se dice infinita. Si necesita que esta señal / suscripción esté vinculada a la vida útil del takeUntil:
puede agregar takeUntil:
con rac_willDeallocSignal
como este:
C objetivo
[[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIApplicationDidEnterBackgroundNotification object:nil]
takeUntil:[self rac_willDeallocSignal]]
subscribeNext:^(id x) {
NSLog(@"Notification received");
}];
Rápido
NSNotificationCenter.defaultCenter()
.rac_addObserverForName(UIKeyboardWillShowNotification, object: nil)
.takeUntil(self.rac_willDeallocSignal())
.subscribeNext { (_) in
print("Notification received")
}