观察RACSequence中的每一项



我在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的新手,所以可能有更简单的方法)。

相关内容

  • 没有找到相关文章

最新更新