我在ParentViewModel上有一个方法,它返回ViewModel对象的RACSequence,如下所示:
- (RACSequence *) viewModels
{
return [self.models.rac_sequence map:^id(Model *model) {
return [[ViewModel alloc] initWithModel: model];
}];
}
每个ViewModels都有一个state属性,它是一个枚举,有3个状态:NotStarted, InProgress和Completed。当所有的viewmodel在我的序列有状态完成我知道ParentViewModel是有效的。我在ParentViewModel上有一个validSignal,我想从viewModels序列中派生出有效的事实。现在我有这样的代码:
BOOL valid = [[self viewModels] all:^BOOL(ViewModel *vm) {
return vm.state == Completed;
}];
这给了我一个指示符,如果序列中的所有ViewModels都是有效的。然后我怎样才能把它变成一个RACSignal,它将在每次ViewModels上的状态属性发生变化时更新?
你首先需要把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
转换为RACSequence
,根据所有值是否为Completed
,我们可以生成@YES
或@NO
的值。
我想这个结果就是你一直在寻找的信号。
(免责声明:我是ReactiveCocoa的新手,所以可能有更简单的方法)。