【问题标题】:ReactiveCocoa, combine two signals on button enabledReactiveCocoa,在按钮启用时结合两个信号
【发布时间】:2015-05-18 08:10:21
【问题描述】:

我正在使用 MVVM 架构,我有两个信号:

RACSignal *internetEnabledSignal = RACObserve(self.regWizardVehicleViewModel, internetConnectionEnabled);
RACSignal *executingRegistrationSignal = RACObserve(self.regWizardVehicleViewModel, isExecuting);

我需要在按钮启用属性上组合和绑定信号。如果没有任何连接或正在执行某些方法,则需要禁用按钮。我一直在寻找解决方案,但我不知道如何将信号与 OR 结合起来。有没有办法做到这一点?下一个问题是:我正在使用 MBProgressHUD。我想在模型中执行异步方法时显示 HUD。 MBProgressHUD 有显示和隐藏方法,不能绑定到按钮启用之类的属性吗?

【问题讨论】:

    标签: ios objective-c mvvm reactive-cocoa


    【解决方案1】:

    有一种方便的方法,-and,它可以更轻松地处理“布尔”值信号:

    返回一个对元组中的每个 NSNumber 应用 AND 的信号。

    要获得带有NSNumbers 的元组,请像这样使用combineLatestWith:

       RAC(self.button, enabled) =[[[executingRegistrationSignal not] 
            combineLatestWith:internetEnabledSignal]
             and];
    

    【讨论】:

    • 非常简单的用法。我会将这个答案标记为有用,但之前的答案对我的另一个问题有答案,因此答案是完整的。非常感谢:)
    【解决方案2】:

    如果我没有误解你,那么使用combineLatest:reduce: 应该可以轻松实现该功能,如下所示:

    RACSignal * enabledSignal = 
    [RACSignal combineLatest:@[internetEnabledSignal, executingRegistrationSignal] 
    reduce:^id(NSNumber * internetEnabled, NSNumber * isExecuting) {
        return @(internetEnabled.boolValue && !isExecuting.boolValue);
    }].distinctUntilChanged;
    
    RAC(self.button, enabled) = enabledSignal;
    

    combineLatest:reduce: 在所有信号至少触发一次之前不会发送任何下一个事件,因此请记住这一点。

    编辑:请参阅 Michał 的回答,通过便捷方法获得更酷的解决方案。

    至于你的另一个问题,我对 MBProgressHUD 不是很熟悉,但这应该可以解决问题:

    [self.hud rac_liftSelector:@selector(show:) withSignalsFromArray:@[
        [enabledSignal ignore:@NO]
    ]];
    [self.hud rac_liftSelector:@selector(hide:) withSignalsFromArray:@[
        [[enabledSignal ignore:@YES] mapReplace:@YES]
    ]];
    

    这有点作弊,我们正在利用 RAC 对这些信号的热切订阅来引发副作用,但如果你是一个实用主义者而不是像我这样的迂腐理想主义者,你可能不会介意。

    这段代码发生的情况是,我们要求 RAC 在我们提供的数组中的每个信号触发后执行给定的选择器,所以它很像 combineLatest:。我们使用mapReplace: 是因为它会将该信号用作(BOOL)animated 参数(这是它作弊的另一个原因)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-27
      • 2014-11-18
      • 1970-01-01
      • 2020-03-03
      相关资源
      最近更新 更多