2

我在 ParentViewModel 上有一个方法,它返回 ViewModel 对象的 RACSequence,如下所示:

- (RACSequence *) viewModels
{
    return [self.models.rac_sequence map:^id(Model *model) {
        return [[ViewModel alloc] initWithModel: model];
    }];
}

每个 ViewModel 都有一个 state 属性,该属性是一个枚举,并具有 3 个状态:NotStarted、InProgress 和 Completed。当我序列中的所有 ViewModel 都具有 Completed 状态时,我知道 ParentViewModel 是有效的。我在 ParentViewModel 上有一个 validSignal,我想从 viewModels 序列中得出有效的事实。目前我有这个代码:

BOOL valid = [[self viewModels] all:^BOOL(ViewModel *vm) {
        return vm.state == Completed;
    }];

如果序列中的所有 ViewModel 都有效,这给了我一个指标。然后我怎样才能把它变成一个 RACSignal,它会在每次 ViewModel 上的 state 属性发生变化时更新?

4

1 回答 1

5

你需要先state变成一个RACSignal,然后一切都很容易。

最终代码将类似于以下内容:

RACSignal *valid = [[RACSignal combineLatest:
                     [[self viewModels] map:^id(ViewModel *viewModel) {
                       return RACAbleWithStart(viewModel, state);
                     }]
                    ]
                    map:^(RACTuple *states) {
                      return @([states.rac_sequence all:^BOOL(NSNumber *state) {
                        return state.unsignedIntegerValue == Completed;
                      }]);
                    }
                   ];

第一个块将每个视图模型映射到观察state属性的信号(起始值作为信号的第一个值)。

combineLatest:将收集RACSignals并创建一个新信号,每次底层信号发生变化时都会触发该信号,并发送一个RACTuple带有每个信号值的信号。

RACTuple然后将其转换为 a RACSequence,我们可以生成一个@YES或的值,这@NO取决于所有值是否都是Completed

我认为结果是您正在寻找的信号。

(免责声明:我是 ReactiveCocoa 的新手,所以可能有更简单的方法)。

于 2013-06-15T19:30:46.777 回答