스트림을 하나의 데이터로 바꾸는 연산자

10795 단어 iOSrxswiftswiftiOS

🔮  마블 다이어그램 출처: https://reactivex.io/documentation/operators.html

스트림을 하나의 데이터로 바꾸는 연산자

복수의 데이터를 발행하는 스트림을 하나의 데이터로 바꿔주는 연산자들입니다.

reduce

스트림에 있는 데이터들을 정의된 accumulator를 통해 하나의 데이터로 합쳐서 발행합니다. 최종적으로 합쳐진 결과는 스트림이 complete 되야지 발행이 됩니다.

accumulator에 연산자만 전달하는 경우

import RxSwift

let disposeBag = DisposeBag()

let subject = PublishSubject<Int>()

subject
    .reduce(0, accumulator: +)
    .subscribe(onNext: { print("총합은 \($0)") })
    .disposed(by: disposeBag)

subject.onNext(1)
subject.onNext(2)
subject.onNext(3)
subject.onNext(4)
subject.onNext(5)
subject.onCompleted()
//🖨 출력 결과
총합은 15

accumulator에 클로저를 전달하는 경우

accumulator에 전달하는 클로저는 두 개의 인자를 받습니다. 첫 번째는 지금까지의 연산 결과 두 번째는 현재 발행된 값입니다.

import RxSwift

let disposeBag = DisposeBag()

let subject = PublishSubject<Int>()

subject
    .reduce(1, accumulator: { acc, value in acc * value })
    .subscribe(onNext: { print("모두 곱한 값은 \($0)") })
    .disposed(by: disposeBag)

subject.onNext(1)
subject.onNext(2)
subject.onNext(3)
subject.onNext(4)
subject.onNext(5)
subject.onCompleted()
//🖨 출력 결과
모두 곱한 값은 120

scan

reduce와 거의 동일합니다. 하지만 complete 되어야지만 결과를 발행하는 reduce와는 달리 연산을 할 때 마다 발행합니다.

import RxSwift

let disposeBag = DisposeBag()

let subject = PublishSubject<Int>()

subject
    .scan(0, accumulator: +)
    .subscribe(onNext: { print("지금까지의 합: \($0)") })
    .disposed(by: disposeBag)

subject.onNext(1)
subject.onNext(2)
subject.onNext(3)
subject.onNext(4)
subject.onNext(5)
//🖨 출력 결과
지금까지의 합: 1
지금까지의 합: 3
지금까지의 합: 6
지금까지의 합: 10
지금까지의 합: 15

좋은 웹페이지 즐겨찾기