2015-04-15 24 views
6

Come smettere di ricevere il nuovo nome dopo qualche evento?Come rimuovere Observer usando ReactiveCocoa?

[RACObserve(self, username) subscribeNext:^(NSString *newName) { 
    if ([newName isEqualToString:@"SomeString"]) 
    { 
     //Do not observe any more 
    } 
}]; 

P.S. Ci scusiamo per la domanda ovvia, ma non riesco a trovare la risposta

risposta

9

È importante pensare a cose un po 'diversamente in ReactiveCocoa: non si vuole "rimuovere" un osservatore, si vuole creare un segnale che si completa quando qualcosa accade.

È possibile utilizzare takeUntilBlock: per derivare un segnale che si ferma l'invio di valori dopo un certo periodo di tempo:

[[RACObserve(self, username) takeUntilBlock:^(NSString *name) { 
    return [name isEqualToString:@"something"]; 
}] subscribeNext:^(NSString *name) { 
    NSLog(@"%@", name); 
}]; 

Ma non invierà una prossima per la stringa @"something", solo i nomi prima di esso. Se questo è desiderato, si potrebbe aggiungere che:

NSString *sentinel = @"something"; 
[[[RACObserve(self, username) takeUntilBlock:^(NSString *name) { 
    return [name isEqualToString:sentinel]; 
}] concat:[RACSignal return:sentinel]] subscribeNext:^(NSString *name) { 
    NSLog(@"%@", name); 
}]; 

Non è molto elegante, ma si potrebbe fare un takeUntilBlockInclusive di supporto che si otterrebbe questo comportamento, e nascondere la grossness in là.

+0

Grazie mille! – serj

8

È possibile utilizzare il metodo "dispose" dell'oggetto RACDisposable restituito da "subscribeNext".

__block RACDisposable *handler = [RACObserve(self, username) subscribeNext:^(NSString *newName) { 
    if ([newName isEqualToString:@"SomeString"]) { 
     //Do not observe any more 
     [handler dispose] 
    } 
}]; 
+0

Grazie! Questo è quello che volevo vedere. – serj

+0

Se 'self.username' è uguale a 'SomeString' prima di questa riga di codice, il gestore non verrà eliminato, ho ragione? – KudoCC