2014-03-03 86 views
2

我還是ReactiveCocoa的新手。我想只是一個觀察者添加到現場,所以沒有這樣的:更好的方式來觀察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]]; 
    } 
}]; 

隨着塊的回調,而無需顯式地分離觀察者,這已經比舊式志願更好。

但是,這是一種抽象層次較高的低級方法嗎?如果是這樣,可以直接調用這個方法嗎?有什麼更好/更高的方式來做到這一點?

回答

10

我建議不要依賴於直接的KVO方法。他們真的是一個實現細節。

讓我們逐漸用慣用的RAC操作符重寫。

首先,我們只是RACObserve代替直接志願代碼:

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

謝謝!我*開始採用這種方法,但觀察塊沒有爲改變而開火。 。確認了正確的方法後,我會提出另一個問題,以找出哪裏出了問題。 –

相關問題