3

I’m new to Swift and ReactiveX. I feel difficult in understanding flatMap. In my tests to learn flatMap, I used range() and sequenceOf() respectively to create observables. But why the outputs are unexpectedly different as seen below:

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) }

The outputs:

 ---- 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

1 Answers1

2

By digging into RxSwift's source code, I think I worked out why. sequenceOf() emits all of its elements all at once, while range() employs a scheduler.

...
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
    }
}