如何使用ReactiveCocoa删除观察者?

时间:2015-04-15 17:06:21

标签: ios objective-c reactive-cocoa

如何在某些事件后停止接收新名字?

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

P.S。抱歉显而易见的问题,但我找不到答案

2 个答案:

答案 0 :(得分:9)

在ReactiveCocoa中思考一些事情很重要:你不想"删除"一个观察者,你想要创造一个在事情发生时完成的信号。

您可以使用takeUntilBlock:派生一段时间后停止发送值的信号:

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

但是,这不会为字符串@"something"发送下一个,只会发送前面的名称。如果需要,您可以追加它:

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

它不是很优雅,但是你可以制作一个takeUntilBlockInclusive帮助器来帮你解决这个问题,然后隐藏它的粗糙度。

答案 1 :(得分:9)

您可以使用方法' dispose'从' subscribeNext'返回的RACDisposable对象。

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