使用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
}
只要设置了两个变量,每次我更改 firstName
或lastName
时都会调用setFullName。
我希望它等到更改已“确定”以调用全名,因此,如果我在相同的函数中设置值,则使用最终值调用setFullName
一次。
我该怎么做?
答案 0 :(得分:2)
您可以使用combineLatest:
代替zip:
。这将等待所有输入信号发送一个值。这样,只有在firstName
,lastName
设置发生时,才会通知订阅者。
如果这是不可接受的,并且只有firstName
或lastName
可能会发生变化,那么您可以将throttle:
添加到combineLatest:
的输出中。这样,如果在限制时间内发生了多次更改,那么只会将最后一个值发送给订阅者。
旁注:如果您可以根据当前值构建fullName
,那么为什么要将其存储在属性中?您可以使用它作为信号。