2

次のように、ViewModel オブジェクトの RACSequence を返す ParentViewModel のメソッドがあります。

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

各 ViewModel には、列挙型である状態プロパティがあり、NotStarted、InProgress、および Completed の 3 つの状態があります。シーケンス内のすべての ViewModel の状態が Completed になると、ParentViewModel が有効であることがわかります。ViewModels シーケンスから有効な事実を導き出したい ParentViewModel に validSignal があります。現時点では、次のコードがあります。

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

これにより、シーケンス内のすべての ViewModel が有効かどうかがわかります。これを、ViewModel のいずれかの状態プロパティが変更されるたびに更新される RACSignal に変換するにはどうすればよいでしょうか?

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下にあるシグナルの 1 つが変化するたびに発火する新しいシグナルを作成し、RACTuple各シグナルの値とともに を送信します。

それRACTupleは に変換され、すべての値が であるかどうかに応じてまたはRACSequenceの値を生成できます。@YES@NOCompleted

結果はあなたが探していた信号だと思います。

(免責事項: ReactiveCocoa は初めてなので、もっと簡単な方法があるかもしれません)。

于 2013-06-15T19:30:46.777 に答える