观察RACSequence中的每个项目

时间:2013-06-15 16:38:10

标签: objective-c mvvm viewmodel reactive-cocoa

我在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属性发生更改时,它将更新?

1 个答案:

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