2015-04-15 19 views
6

Wie höre ich auf, nach einem Ereignis den neuen Namen zu erhalten?Wie entferne ich den Beobachter mit ReactiveCacoa?

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

P.S. Sorry für offensichtliche Frage, aber ich kann keine Antwort finden

Antwort

9

Es ist wichtig, in ReactiveCocoa über Dinge ein wenig anders zu denken: Sie möchten nicht einen Beobachter "entfernen", möchten Sie ein Signal erstellen, das abgeschlossen ist, wenn etwas das passiert.

Sie können takeUntilBlock: verwenden, um ein Signal abzuleiten, die Werte nach einer bestimmten Zeit das Senden stoppen:

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

Aber das wird kein nächstes für die Zeichenfolge @"something", nur die Namen, bevor sie senden. Wenn dies gewünscht ist, können Sie es anhängen:

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

Es ist nicht sehr elegant, aber man konnte einen takeUntilBlockInclusive Helfer, die Sie dieses Verhalten bekommen würde, und die Rohheit dort verstecken.

+0

Vielen Dank! – serj

8

Sie können die Methode 'dispose' des RACDisposable-Objekts verwenden, die von 'subscribeNext' zurückgegeben wird.

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

Danke! Das wollte ich sehen. – serj

+0

Wenn 'self.username 'gleich' SomeString 'vor dieser Codezeile ist, wird der Handler nicht disponieren, habe ich recht? – KudoCC

Verwandte Themen