看博客不懂地方

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() 
    let intOb2 = PublishSubject() 

    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() 
    let intOb2 = PublishSubject() 
    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) 

你可能感兴趣的:(看博客不懂地方)