在ReactiveCocoa中观察的更好方法

时间:2014-03-03 13:50:07

标签: objective-c cocoa-touch reactive-cocoa

我还是ReactiveCocoa的新手。我想简单地将一个观察者添加到一个字段中,所以这样做:

[_countryPicker rac_observeKeyPath:@"value" options:nil observer:self block:^(VBCountry* value, NSDictionary* change)
{
    if ([_mobileField.textField.text length] == 0)
    {
        [_mobileField.textField setText:[NSString stringWithFormat:@"+%i", value.dialCode]];
    }
}];

使用块回调,并且不需要显式分离观察者,这已经比旧式KVO更好了。

但是,这是一个具有更高抽象级别的低级方法吗?如果是这样,可以直接调用此方法吗?什么是更好/更高的方式呢?

1 个答案:

答案 0 :(得分:10)

我建议不要依赖直接的KVO方法。它们实际上是一个实现细节。

让我们逐步用惯用的RAC运算符重写它。

首先,我们只需用RACObserve替换直接KVO代码:

[RACObserve(_countryPicker, value) subscribeNext:^(VBCountry *value) {
    if ([_mobileField.textField.text length] == 0)
    {
        [_mobileField.textField setText:[NSString stringWithFormat:@"+%i", value.dialCode]];
    }
}];

然后我们会将if和字符串格式替换为-filter:-map:

[[[RACObserve(_countryPicker, value) filter:^(id _) {
    return [_mobileField.textField.text length] > 0;
}] map:^(VBCountry *value) {
    return [NSString stringWithFormat:@"+%i", value.dialCode];
}] subscribeNext:^(NSString *text) {
    [_mobileField.textField setText:text];
}];

最后,我们将使用RAC宏来明确指定任务:

RAC(_mobileField.textField, text) = [[RACObserve(_countryPicker, value) filter:^(id _) {
    return [_mobileField.textField.text length] > 0;
}] map:^(VBCountry *value) {
    return [NSString stringWithFormat:@"+%i", value.dialCode];
}];