扫描不同类型信号的合并

时间:2013-08-17 18:02:04

标签: reactive-cocoa

假设我有一个数组arraySignal的信号和一个对象addedObjectsSignal的信号。

我想定义第三个信号modifiedArraySignal,该信号从arraySignal获取最新数组,并从addedObjectsSignal发送之后添加的对象来自arraySignal的最新数组。

这是一种方法:

    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:]

2 个答案:

答案 0 :(得分: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];

答案 1 :(得分: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];
}];