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);
}