0

arraysarraySignalのシグナルと objects のシグナルがあるとしますaddedObjectsSignal

modifiedArraySignalから最新の配列を取得し、 からの最新の配列以降に送信された からarraySignalのオブジェクトを追加する3 番目のシグナル を定義したいと思います。addedObjectsSignalarraySignal

これを行う1つの方法は次のとおりです。

    RACSignal *modifiedArraySignal =
    [[RACSignal
     merge:@[arraySignal, addedObjectsSignal]]
     scanWithStart:@[]
     reduce:^(id running, id next) {
         if ([next isKindOfClass:[NSArray class]])
             return next;
         else
             return [running arrayByAddingObject:next];
     }];

を使用しない別のアプローチはあります-[NSObject isKindOfClass:]か?

4

2 に答える 2

2

本来はコメントですが、コード整形。

新しいアレイが送信されたら、以前のアレイへの更新を停止しますか? つまり、アレイ B が送信された後、アレイ A とアレイ B の両方のスキャンを同時に実行するかどうか。以前の配列への更新を停止する場合は、次の代わりに-map:/を使用します。-switchToLatest-flattenMap:

RACSignal *modifiedArraySignal = [[arraySignal
    map:^(NSArray *array) {
        return [[addedObjectsSignal
            scanWithStart:array reduce:^(NSArray *running, id next) {
                return [running arrayByAddingObject:next];
            }]
            startWith:array];
    }]
    switchToLatest];
于 2013-08-18T14:30:31.603 に答える
0

質問で提供したものよりも気に入った解決策を思いつきました。これは同等だと思います。

RACSignal * modifiedArraySignal =
[arraySignal flattenMap:^(NSArray *array) {
    return [[[addedObjectsSignal
            takeUntil:[arraySignal skip:1]]
            scanWithStart:array
            reduce:^(NSArray *running, id next) {
                return [running arrayByAddingObject:next];
            }]
            startWith:array];
}];
于 2013-08-17T19:03:36.840 に答える