Reactivecocoa 传递新价值
Reactivecocoa send new value
我是 reactivecocoa 的新手,我需要帮助。我正在寻找,但我无法弄清楚。假设我有 UIPickerView。在那个 pickerView 中有 4 个选项,每种语言一个,例如德语、英语、西班牙语、法语。在选定的语言上,我需要发回缩写 english - en, french - fr ...
我正在使用 MVVM 架构,这是我 ViewController 中的方法。在该方法中,我绑定了 ViewModel 和选定的属性。
- (void)bindeViewModel
{
RAC(self, selectedLanguageAbbreviation) = self.languageViewModel.observeSelectedLanguage;
}
"observeSelectedLanguage" 是我的信号,它的实现是:
-(RACSignal *) observeSelectedLanguage
{
@weakify(self);
return [RACObserve(self, selectedLanguage) filter:^BOOL(NSString *value){
@strongify(self);
if (value == LocalizedString(myValueString(English)))
{
self.selectedLanguageAbbreviation = @"en";
return self.selectedLanguageAbbreviation;
}
else if (value == LocalizedString(myValueString(German)))
{
self.selectedLanguageAbbreviation = @"ge";
return self.selectedLanguageAbbreviation;
}
else if (value == LocalizedString(myValueString(French)))
{
self.selectedLanguageAbbreviation = @"fr";
return self.selectedLanguageAbbreviation;
}
else if (value == LocalizedString(myValueString(Spanish)))
{
self.selectedLanguageAbbreviation = @"sp";
return self.selectedLanguageAbbreviation;
}
else
{
self.selectedLanguageAbbreviation = @"en";
return self.selectedLanguageAbbreviation;
}
}];
}
"myValueString" 是从枚举返回字符串的宏,所以英语、法语等是枚举的一部分。你能帮我解释一下如何发送所选语言的缩写吗?谢谢
您正在寻找 map
而不是 filter
:
return [RACObserve(self, selectedLanguage) map:^id(NSString *value){
...
}];
补充建议
此外,在信号内部产生副作用(设置 self.selectedLanguageAbbreviation
)不是很好的做法,应尽可能避免。你可以这样改变你的逻辑:
将 selectedLanguageAbbreviation
的值显式绑定到 selectedLanguage
(在视图模型的 -init
中):
RAC(self, selectedLanguageAbbreviation) = [RACObserve(self, selectedLanguage) map:^id(NSString* language) {
// do your mapping here
}];
然后你可以删除 -observeSelectedLanguage
方法并将视图控制器的 selectedLanguageAbbreviation
直接绑定到视图模型的 selectedLanguageAbbreviation
(如果仍然需要):
- (void)bindeViewModel
{
RAC(self, selectedLanguageAbbreviation) = RACObserve(self.languageViewModel, selectedLanguageAbbreviation);
}
我是 reactivecocoa 的新手,我需要帮助。我正在寻找,但我无法弄清楚。假设我有 UIPickerView。在那个 pickerView 中有 4 个选项,每种语言一个,例如德语、英语、西班牙语、法语。在选定的语言上,我需要发回缩写 english - en, french - fr ... 我正在使用 MVVM 架构,这是我 ViewController 中的方法。在该方法中,我绑定了 ViewModel 和选定的属性。
- (void)bindeViewModel
{
RAC(self, selectedLanguageAbbreviation) = self.languageViewModel.observeSelectedLanguage;
}
"observeSelectedLanguage" 是我的信号,它的实现是:
-(RACSignal *) observeSelectedLanguage
{
@weakify(self);
return [RACObserve(self, selectedLanguage) filter:^BOOL(NSString *value){
@strongify(self);
if (value == LocalizedString(myValueString(English)))
{
self.selectedLanguageAbbreviation = @"en";
return self.selectedLanguageAbbreviation;
}
else if (value == LocalizedString(myValueString(German)))
{
self.selectedLanguageAbbreviation = @"ge";
return self.selectedLanguageAbbreviation;
}
else if (value == LocalizedString(myValueString(French)))
{
self.selectedLanguageAbbreviation = @"fr";
return self.selectedLanguageAbbreviation;
}
else if (value == LocalizedString(myValueString(Spanish)))
{
self.selectedLanguageAbbreviation = @"sp";
return self.selectedLanguageAbbreviation;
}
else
{
self.selectedLanguageAbbreviation = @"en";
return self.selectedLanguageAbbreviation;
}
}];
}
"myValueString" 是从枚举返回字符串的宏,所以英语、法语等是枚举的一部分。你能帮我解释一下如何发送所选语言的缩写吗?谢谢
您正在寻找 map
而不是 filter
:
return [RACObserve(self, selectedLanguage) map:^id(NSString *value){
...
}];
补充建议
此外,在信号内部产生副作用(设置 self.selectedLanguageAbbreviation
)不是很好的做法,应尽可能避免。你可以这样改变你的逻辑:
将 selectedLanguageAbbreviation
的值显式绑定到 selectedLanguage
(在视图模型的 -init
中):
RAC(self, selectedLanguageAbbreviation) = [RACObserve(self, selectedLanguage) map:^id(NSString* language) {
// do your mapping here
}];
然后你可以删除 -observeSelectedLanguage
方法并将视图控制器的 selectedLanguageAbbreviation
直接绑定到视图模型的 selectedLanguageAbbreviation
(如果仍然需要):
- (void)bindeViewModel
{
RAC(self, selectedLanguageAbbreviation) = RACObserve(self.languageViewModel, selectedLanguageAbbreviation);
}