3

我是 Swift 和 ReactiveX 的新手。我觉得理解 flatMap 很困难。在我学习 flatMap 的测试中,我分别使用 range() 和 sequenceOf() 来创建 observables。但是为什么输出出乎意料地不同,如下所示:

import RxSwift



let sequenceInt = sequenceOf(1,2,3)

let rangeInt = range(1,3)



print( " ---- expects:  [[1],[1,2],[1,2,3]] " )

print (" ---- hence: [1,1,2,1,2,3]")



print(" ---- sequenceOf misbehaving ----")

sequenceInt.flatMap { i in range( 1, i) }.subscribe { print($0) }

print(" ---- range behaves as expected ----")



rangeInt.flatMap { i in range( 1, i) }.subscribe { print($0) }

输出:

 ---- expects:  [[1],[1,2],[1,2,3]] 

 ---- hence: [1,1,2,1,2,3]

 ---- sequenceOf misbehaving ----

Next(1)

Next(1)

Next(1)

Next(2)

Next(2)

Next(3)

Completed

 ---- range behaves as expected ----

Next(1)

Next(1)

Next(2)

Next(1)

Next(2)

Next(3)

Completed
4

1 回答 1

2

通过深入研究 RxSwift 的源代码,我想我找到了原因。sequenceOf() 一次发出所有元素,而 range() 使用调度程序。

...
public func sequenceOf<E>(elements: E ...) -> Observable<E> {
    return AnonymousObservable { observer in
        for element in elements {
            observer.on(.Next(element))
        }

        observer.on(.Completed)
        return NopDisposable.instance
    }
}
于 2015-10-04T20:45:24.627 回答