Ios 如何使用ReactiveCocoa删除观察者?

Ios 如何使用ReactiveCocoa删除观察者?,ios,objective-c,reactive-cocoa,Ios,Objective C,Reactive Cocoa,如何在某些事件后停止接收新名称 [RACObserve(self, username) subscribeNext:^(NSString *newName) { if ([newName isEqualToString:@"SomeString"]) { //Do not observe any more } }]; 顺便说一句,很抱歉这个明显的问题,但我找不到答案。在ReactiveCocoa中,有一点不同的想法很重要:你们不想“删除”一个观察者,你们想

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

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

顺便说一句,很抱歉这个明显的问题,但我找不到答案。

在ReactiveCocoa中,有一点不同的想法很重要:你们不想“删除”一个观察者,你们想创建一个信号,当事情发生时,这个信号就完成了

您可以使用
takentilblock:
导出一个信号,该信号将在特定时间后停止发送值:

[[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);
}];

它不是很优雅,但是你可以制作一个
TakenTilblockInclusive
帮助器来帮助你实现这种行为,并将粗俗隐藏在其中。

你可以使用方法“dispose”处理从“subscribeNext”返回的一次性对象

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

谢谢这就是我想看到的。如果
self.username
在这行代码之前等于'SomeString',处理程序将不会处理,对吗?