繁体   English   中英

如何使用ReactiveCocoa删除观察者?

[英]How to remove observer using ReactiveCocoa?

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

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

PS很抱歉显而易见的问题,但我找不到答案

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

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

在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帮助器,它可以帮助你实现这种行为,并隐藏其中的takeUntilBlockInclusive

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM