我在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属性发生更改时,它将更新?
答案 0 :(得分: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
每个信号的值。< / p>
然后将RACTuple
转换为RACSequence
,我们可以生成@YES
或@NO
的值,具体取决于所有值是Completed
还是不
我认为结果就是你要找的信号。
(免责声明:我是ReactiveCocoa的新手,所以可能有一种更简单的方法)。