옵져버블이 방출하는 모든 요소를 하나의 배열로 방출 (종료전까지 전달 x)
let subject = PublishSubject<Int>() subject .toArray() .subscribe { print$(0) } .disposed(by: disposeBag) subject.onNext(1) // 방출 X subject.onNext(2) // 방출 X subject.onCompleted() // 방출 success([1,2])
옵저버블이 방출하는 요소를 대상으로 함수를 실행하고 결과를 새로운 옵저버블로 리턴
Observable.from([1, 2, 3])
.map { "age : \($0)" }
.subscribe { print($0) }
.disposed(by: disposeBag)
원본 옵져버블이 항목을 방출하면 flatmap 이 변환연산 시작. 원본 옵져버블이 방출하는 값을 지속적으로 감시, 최신 값 확인.
모든 옵져버블이 방출하는 항목을 모아 최종적으로 하나의 옵져버블 방출let a = BehaviorSubject(value : 1) let b = BehaviorSubject(value : 2)
let subject = PublishSubject<BehaviorSubject>()
subject
.flatMap { $0.asObservable() } //subject -> observable
.subscribe { print($0) }
.disposed(by: disposeBag)
subject.onNext(a)
subject.onNext(b)
-- next(1), next(2)
- 네트워크 요청에 주로 사용
- 최신 값도 다 전달
## flatMapFirst, flatMapLatest
- 하나로 병합 X
### flatMapFirst
> 처음에 변환된 옵져버블이 방출하는 항목만 구독자로 전달, 나머지는 무시
### flatMapLatest
> 가장 최근에 항목을 방출한 옵져버블을 제외한 나머지는 무시
## scan
> accumulator function을 활용, 작업 결과 누적 + 중간결과도 알고 싶을 때 사용
```swift
Observable.range(start: 1, count: 10)
.scan(0, accmulator: +)
특정주기동안 옵져버블이 방출하는 항목 수집, 배열 요소를 하나로 방출
Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance) .buffer(timeSpan: .seconds(2), count: 3, scheduler: MainScheduler.instance) .take(5)
옵져버블이 방출하는 항목들을 작은단위의 옵져버블로 분해 > 옵져버블을 방출하는 옵져버블(inner observable) 리턴
Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance) .window(timeSpan : .seconds(2), count: 3, scheduler: MainScheduler.instance) .take(5) .subscribe { print($0) if let obs = $0.element { obs.subscribe { print (" inner : " , $0) } }
groupBy
방출되는 요소를 조건에 따라 그룹핑, groupedObesrvable 방출
Observable.from(["hi","hello","ad"]) .groupBy ( $0.count } .flatMap ( $0.toArray()) } .subscribe {print($0)} })