假设我有一个数组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:]
?
答案 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];
}];