1 flatMap函數
map在做轉換的時候很容易出現『升維』的情況,即:轉變之后,從一個序列變成了一個序列的序列。
什么是『升維』?在集合中我們可以舉這樣一個例子,我有一個好友列表[p1, p2, p3]
,那么如果要獲取我好友的好友的列表,可以這樣做:
**Swift **
myFriends.map { $0.getFriends() }
結果就成了[[p1-1, p1-2, p1-3], [p2-1], [p3-1, p3-2]],這就成了好友的好友列表的列表了。這就是一個『升維』的例子。
在 Swift 中,我們可以用flatMap過濾掉map之后的nil結果。在 Rx 中,flatMap可以把一個序列轉換成一組序列,然后再把這一組序列『拍扁』成一個序列。
** RxSwift **
example("flatMap") {
let sequenceInt = sequenceOf(1, 2, 3)
let sequenceString = sequenceOf("A", "B", "--")
sequenceInt
.flatMap { int in
sequenceString
}
.subscribe {
print($0)
}
}
--- flatMap example ---
Next(A)
Next(B)
Next(--)
Next(A)
Next(B)
Next(--)
Next(A)
Next(B)
Next(--)
Completed
2 combineLatest
如果存在兩條事件 隊列,需要同時監聽,那么每當有新的事件發生的時候,combineLatest
會將每個隊列的最新的一個元素進行合并。
RxSwift
example("combineLatest 1") {
let intOb1 = PublishSubject<String>()
let intOb2 = PublishSubject<Int>()
combineLatest(intOb1, intOb2) {
"\($0) \($1)"
}
.subscribe {
print($0)
}
intOb1.on(.Next("A"))
intOb2.on(.Next(1))
intOb1.on(.Next("B"))
intOb2.on(.Next(2))
}
--- combineLatest 1 example ---
Next(A 1)
Next(B 1)
Next(B 2)
3 zip
zip 人如其名,就是壓縮兩條隊列用的,不過它會等到兩個隊列的元素一一對應地湊齊了之后再合并。
Swift
example("zip 1") {
let intOb1 = PublishSubject<String>()
let intOb2 = PublishSubject<Int>()
zip(intOb1, intOb2) {
"\($0) \($1)"
}
.subscribe {
print($0)
}
intOb1.on(.Next("A"))
intOb2.on(.Next(1))
intOb1.on(.Next("B"))
intOb1.on(.Next("C"))
intOb2.on(.Next(2))
}
--- zip 1 example ---
Next(A 1)
Next(B 2)