RxSwift – Combining Operator

startWith
시퀀스 앞에 값을 추가합니다

Observerble.of(1, 2, 3)
.startWith(0)
.subscribe { print($0) }
.disposed(by: disposeBag)

next(0)
next(1)
next(2)
next(3)
completed

concat
여러 요소를 합칩니다.

let first = Observable.of(1, 2)
let sencond = Observable.of(3, 4)
let third = Observable.of(5, 6)
let observable = Observable.concat([first, second, third])
.subscribe { print($0) }
.disposed(by: disposeBag)

next(1)
next(2)
next(3)
next(4)
next(5)
next(6)
completed

concatMap
순서를 보장하며 합친다

let sequences = [
    "A": Observable.of("1", "2", "3"),
    "B": Observable.of("a1", "a2", "a3")
]
let observable = Observable.of("A", "B")
observable.concatMap { sequences[$0] ?? .empty() }
.subscribe { print($0.element }
.disposed(by: disposeBag)

1
2
3
a1
a2
a3

merge
요소를 합하여 먼저 들어오는 순으로 방출한다.

let a = PublishSubject<Sting>()
let b = PublishSubject<Sting>()
let source = Observable.of(a, b)
.merge()
.subscribe { print($0) }

a.onNext("a1")
b.onNext("b1")
a.onNext("a2")

a1
b1
a2

combineLatest
두개 시퀀스 모두 이벤트가 방출되어야 합쳐진 마지막 이벤트를 방출합니다.
시퀀스에 변경이 없는 경우 마지막 값을 함께 방출 합니다.

let a = PublishSubject<String>()
let b = PublishSubject<String>()
Observable.combineLastest(a, b)
.subscribe { print($0) }
.disposed(by: disposeBag)

a.onNext("1")
a.onNext("2")
b.onNext("3")
b.onNext("4")
a.onNext("99")
a.onNext("91")
a.onNext("92")
a.onNext("93")

//로그
next(("2", "3"))
next(("2", "4"))
next(("99", "4"))
next(("91", "4"))
next(("92", "4"))
next(("93", "4"))

zip
두 시퀀스 모두 첫 이벤트가 방출 되어야 합쳐진 이벤트를 방출한다
A, B 각각 이벤트를 하나씩 발생시킬때 까지 기다린다.

let a = PublishSubject<String>()
let b = PublishSubject<String>()
Observable.zip(a, b)
.subscribe { print($0) }
.disposed(by: disposeBag)

a.onNext("1")
a.onNext("2")
b.onNext("3")
b.onNext("4")
a.onNext("99")
a.onNext("91")
a.onNext("92")
a.onNext("93")
b.onNext("x")

//로그
next(("1", "3"))
next(("2", "4"))
next(("99", "x"))

withLatestFrom
특정 트리거를 방출 했을때 특정 상태의 최신 값을 얻고 싶을 때 사용합니다.
비슷한 기능을 하는 sample 은 중복된 값이 들어올 경우는 이벤트를 한번만 방출합니다.

let button = PublishSubject<Void>()
let textField = PublishSubject<String>()
button.withLatestFrom(textField)
.subscribe(onNext: {
print($0)
})
.disposed(by: rx.disposeBag)
textField.onNext("S")
textField.onNext("SW")
textField.onNext("SWI")
textField.onNext("SWIF")
textField.onNext("SWIFT")
button.onNext(())
button.onNext(())

SWIFT
SWIFT

reduce
모든 이벤트의 연산한 값을 방출 합니다.

        let a1 = Observable.of(1, 2, 3)
        a1.reduce(10, accumulator: +)
            .subscribe(onNext: {
                print($0)
            }).disposed(by: rx.disposeBag)

scan
하나씩 연산될때 마다 변경된 값을 방출합니다.

let s10 = Observable.of(1, 2, 3, 4, 5)
        s10.scan(0, accumulator: +)
            .subscribe(onNext: {
                print($0)
            }).disposed(by: rx.disposeBag)
에 발행했습니다
RXSWIFT(으)로 분류되었습니다

aaron님이 작성

아무것도 안해도 시간은 흐른다.

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다