2016-09-20 52 views
0

我想根據第一個值對兩個流進行分組和合並。用一個具體例子說明,如何根據第一個對兩個流進行分組和合並?

Marbles

每當第一流變化,我想值與所述第二流結合但跳過緊跟其後的值(即圖中的值1,圖3和6) 。

我在iOS上使用ReactiveCocoa,但歡迎使用其他反應性框架的示例。

回答

1

我在ReactiveCocoa當前實現:

var cook = MutableProperty("") 
var ingredient = MutableProperty("") 

cook.signal.observeNext { cook in 
    print(">", cook) 
} 

let skipFirst = cook.signal 
    .flatMap(.latest) { cookValue in 
     return ingredient.signal 
      .map { ingredientValue in 
       "\(cookValue) \(ingredientValue)" 
      } 
      .skip(first: 1) 
    } 

skipFirst.observeNext { str in 
    print(">>", str) 
} 

// Send values 

cook.value = "grill" 
ingredient.value = "asparagus" 
ingredient.value = "beef" 

cook.value = "fry" 
ingredient.value = "ice cream" 
ingredient.value = "donut" 
ingredient.value = "shoe" 

cook.value = "steam" 
ingredient.value = "egg" 
ingredient.value = "lettuce" 

此打印:

> grill 
>> grill beef 
> fry 
>> fry donut 
>> fry shoe 
> steam 
>> steam lettuce 

但是,這意味着如果我也希望用每個組的第一個值,我不得不重複flatMap轉型,這似乎不太乾。

cook.signal 
    .flatMap(.latest) { cookValue in 
     return ingredient.signal 
      .map { ingredientValue in 
       "\(cookValue) \(ingredientValue)" 
      } 
      .take(first: 1) 
    } 
    .observeNext { str in 
     print("**>", str) 
    } 
2

在JavaScript中,它會是這樣(不,雖然測試):

const result$ = a$.flatMapLatest(a => b.skip(1).map(b => {a,b})) 

什麼,這是應該做的:

  • 爲每個到來的一個,監聽BS,並跳過第一個b,並將b和a放在一起

約束條件有:

  • B必須是熱流的方式

尼斯圖。

相關問題