Transforming Operators

Youn·2021년 12월 5일
0

iOS-RxSwift

목록 보기
8/8
post-thumbnail

toArray

옵져버블이 방출하는 모든 요소를 하나의 배열로 방출 (종료전까지 전달 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])

map

옵저버블이 방출하는 요소를 대상으로 함수를 실행하고 결과를 새로운 옵저버블로 리턴

Observable.from([1, 2, 3])
	.map { "age : \($0)" }
    .subscribe { print($0) }
	.disposed(by: disposeBag)
  • 파라미터와 다른 타입을 리턴해도 됨 (문자열 > 정수)

flatMap

원본 옵져버블이 항목을 방출하면 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: +)
    

buffer

특정주기동안 옵져버블이 방출하는 항목 수집, 배열 요소를 하나로 방출

Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)
	.buffer(timeSpan: .seconds(2), count: 3, scheduler: MainScheduler.instance)
    .take(5)

window

옵져버블이 방출하는 항목들을 작은단위의 옵져버블로 분해 > 옵져버블을 방출하는 옵져버블(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)}
   })
profile
youn

0개의 댓글