等待通知ReactiveCocoa中的订阅者,直到代码完成?

时间:2013-08-24 14:24:43

标签: ios objective-c key-value-observing reactive-programming reactive-cocoa

使用ReactiveCocoa和KVO,如果您订阅了某些内容,它会在您更改绑定的值时立即通知订阅者。假设我的状态取决于user.firstName和user.lastName:

RAC(self.fullName) = [RACSignal 
    combineLatest:@[RACAble(self.firstName), RACAble(self.lastName)]
    reduce:^(NSString* firstName, NSString* lastName) {
        return [NSString stringWithFormat:@"%@ %@", firstName, lastName];
    }];

self.firstName = @"Bob";
self.lastName  = @"Wilson";
self.firstName = @"Amy";
self.lastName  = @"Johnson";

// ... 

- (void)setFullName:(NSString*)fullName
{
    NSLog(@"FULL NAME %@", fullName);
    // Bob Wilson
    // Amy Wilson
    // Amy Johnson
}

只要设置了两个变量,每次我更改 firstNamelastName时都会调用setFullName。

我希望它等到更改已“确定”以调用全名,因此,如果我在相同的函数中设置值,则使用最终值调用setFullName一次。

我该怎么做?

1 个答案:

答案 0 :(得分:2)

您可以使用combineLatest:代替zip:。这将等待所有输入信号发送一个值。这样,只有在firstNamelastName设置发生时,才会通知订阅者。

如果这是不可接受的,并且只有firstNamelastName可能会发生变化,那么您可以将throttle:添加到combineLatest:的输出中。这样,如果在限制时间内发生了多次更改,那么只会将最后一个值发送给订阅者。

旁注:如果您可以根据当前值构建fullName,那么为什么要将其存储在属性中?您可以使用它作为信号。