【问题标题】:Scanning over a merge of differently typed signals扫描不同类型信号的合并
【发布时间】:2013-08-17 18:02:03
【问题描述】:

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

我想定义第三个信号modifiedArraySignal,它从arraySignal 获取最新数组并将addedObjectsSignal 发送的对象添加到其中因为来自@987654326 的最新数组@。

这是一种方法:

    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:] 的方法吗?

【问题讨论】:

  • 我应该指出,这种方法在数组数组上会中断。

标签: reactive-cocoa


【解决方案1】:

最初是注释,但是,代码格式。

发送新数组时,是否要停止对先前数组的更新?换句话说,如果在发送阵列 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];

【讨论】:

  • 不错。我刚刚编辑了自己的答案,使其具有停止更新先前数组的属性,但您的解决方案更优雅。
  • 谢谢。您的 -takeUntil: 方法的行为应该相同。
【解决方案2】:

我想出了一个比我在问题中给出的解决方案更喜欢的解决方案,并且我认为它是等效的:

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];
}];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多