스트림을 하나의 데이터로 바꾸는 연산자
🔮 마블 다이어그램 출처: 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
Author And Source
이 문제에 관하여(스트림을 하나의 데이터로 바꾸는 연산자), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@comdongsam/스트림을-하나의-데이터로-바꾸는-연산자저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)