toArray

  • Observable이 방출하는 모든 요소를 배열에 담아 방출한다.
  • Observable이 방출하는 모든 요소를 모아야하기 때문에 completed 전까지는 이벤트를 전달하지 않는다.
Observable.from([1, 2, 3, 4, 5])
    .toArray()
    .subscribe { print($0) } // success([1, 2, 3, 4, 5])

let subject = PublishSubject<Int>()
subject
    .toArray()
    .subscribe { print($0) }

subject.onNext(1) // 무시
subject.onNext(2) // 무시
subject.onNext(3) // 무시
subject.onCompleted() // success([1, 2, 3])

map

  • Swift의 고차함수 map(_:)과 동일하다.
  • 방출되는 이벤트를 가공하고자 할때 쓴다.
var elements = ["Swift", "RxSwift", "Xcode"]

Observable
    .from(elements)
    .map { "Hello \($0)" }
    .subscribe { print($0) } // next(Hello Swift) -> next(Hello RxSwift) -> ext(Hello Xcode) -> completed

flatMap

  • map(_:)과 비슷하지만 가공된 이벤트를 Observable로 리턴한다.
  • 모든 Observable이 방출하는 항목을 모아서 하나의 Observable로 리턴한다.
let subject1 = BehaviorSubject(value: 1)
let subject2 = BehaviorSubject(value: 2)

let flatMap = PublishSubject<BehaviorSubject<Int>>()

flatMap
    .flatMap{ $0.asObservable() }
    .subscribe { print($0) }

flatMap.onNext(subject1) // next(1)
flatMap.onNext(subject2) // next(2)

flatMapFirst

  • flatMap(_:)과 비슷하지만, 첫번째 변환된 Observable이 방출하는 항목만 전달한다.
let subject1 = BehaviorSubject(value: 1)
let subject2 = BehaviorSubject(value: 2)

let flatMap = PublishSubject<BehaviorSubject<Int>>()

flatMap
    .flatMapFirst{ $0.asObservable() }
    .subscribe { print($0) }

flatMap.onNext(subject1) // next(1)
flatMap.onNext(subject2) // 무시

subject2.onNext(22) // 무시
subject1.onNext(11) // next(11)

flatMapLatest

  • flatMapFirst(_:)와 정 반대로, 마지막 변환된 Observable이 방출하는 항목만 전달한다.
let subject1 = BehaviorSubject(value: 1)
let subject2 = BehaviorSubject(value: 2)

let flatMap = PublishSubject<BehaviorSubject<Int>>()

flatMap
    .flatMapLatest{ $0.asObservable() }
    .subscribe { print($0) }

flatMap.onNext(subject1) // next(1)
flatMap.onNext(subject2) // next(2)

subject2.onNext(22) // next(22)
subject1.onNext(11) // 무시

scan

  • Swift의 고차함수 reduce(_:_:)와 비슷한데, 다른 점은 중간 절차를 모두 전달한다.
Observable.range(start: 1, count: 5)
    .scan(0, accumulator: +)
    .subscribe { print($0) } // next(1) -> next(3) -> next(6) -> next(10) -> next(15) -> completed

buffer

  • 특정 주기동안 방출되는 이벤트를 모아 배열로 방출한다.
  • 주기가 다 지나지 않아도 count가 일치하면 방출한다.
Observable<Int>
    .interval(.seconds(1), scheduler: MainScheduler.instance)
    .buffer(timeSpan: .seconds(2), count: 3, scheduler: MainScheduler.instance)
    .take(5)
    .subscribe { print($0) } // next([0]) -> next([1, 2]) -> next([3, 4, 5]) -> next([6, 7]) -> next([8, 9]) -> completed
  • 위처럼 count가 일치하지 않아도 지정된 주기가 지나서 방출하는 경우도 있고, 시간상의 오차로 count가 일치하게되면 지정된 주기가 지나지 않아도 방출하는 경우가 있다.

window

  • 파라미터는 buffer(timeSpan:count:scheduler:)와 같다.
  • 반면 window(timeSpan:count:scheduler:)는 Observable을 방출하는 Observable을 방출한다. (Inner Observable)
Observable<Int>
    .interval(.seconds(1), scheduler: MainScheduler.instance)
    .window(timeSpan: .seconds(2), count: 3, scheduler: MainScheduler.instance)
    .take(5)
    .subscribe { print($0) } // next(RxSwift.AddRef<Swift.Int>) * 5 -> completed

groupBy

  • Observable이 방출하는 요소를 원하는대로 그룹화하여 리턴한다.
Observable.range(start: 1, count: 10)
    .groupBy { $0.isMultiple(of: 2) }
    .flatMap { $0.toArray() }
    .subscribe { print($0) } // next([2, 4, 6, 8, 10]) -> next([1, 3, 5, 7, 9]) -> completed