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