2013-08-17 24 views
0

假設我有一個數組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

我應該指出的是,在數組的數組這種做法休息。 – Tom

回答

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]; 
+0

不錯。我剛剛編輯了我自己的答案,以使其具有在先前陣列上停止更新的屬性,但是您的解決方案更加優雅。 – Tom

+0

謝謝。你的'-takeUntil:'方法應該表現相同。 –

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