我还是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更好了。
但是,这是一个具有更高抽象级别的低级方法吗?如果是这样,可以直接调用此方法吗?什么是更好/更高的方式呢?
答案 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];
}];