RxSwift 정리 4 - operators(.startWith .concat .concatMap .marge .combineLatest .zip)

2021. 8. 23. 14:25Developer.TokkiSea/Apple

반응형

 

 

.startWith()

시작 값을 지정

let numbers = Observable.of(2, 3, 4)
let observable = numbers.startWith(1)
observable.subscribe(onNext: { value in 
print(value) 
}) // 1,2,3,4

 

.concat()

두 시퀸스를 합친다.(순서에따라 앞,뒤 주의)

동작 > first subscribe 하고 complete 발생한후 second를 subscribe한다.

 

let first = Observable.of(1, 2, 3) 
let second = Observable.of(4, 5, 6)
Observable.concat([first, second]).subscribe(onNext: { value in print(value) })
//1,2,3,4,5,6
first.concat(second).subscribe(onNext: { value in print(value) })
//1,2,3,4,5,6

 

.concatMap()

flatMap 와 비슷하게 사용할 수 있지만

기존 데이터 구독 시 순서를 보장할 수 있다.

let seq = [ "Number": Observable.of("1", "2", "3"), 
				  "Alphabet": Observable.of("a", "b", "c") ] 
let observable = Observable.of("Number", "Alphabet") 

observable.flatMap { idx in
	seq[idx] ?? .empty()
}.subscribe { 
	print($0.element ?? "") }) // 1, 2, a, 3, b, c

observable.concatMap{ idx in 
	return seq[idx] ?? .empty() 
}.subscribe { 
	print($0.element ?? "") } // 1, 2, 3, a, b, c

 

.marge()

시퀸스를 합치는 또다른 방법

merge(maxConcurrent:) 를 지정하면 진행 중인 시퀸스의 최대치를 지정한다.

최대치 보다 크면 진행 시퀸스가 완료된 이 후 합쳐진다.

 

let number = PublishSubject<String>()
let alphabet = PublishSubject<String>()
let source = Observable.of(number.asObservable(), alphabet.asObservable())
	// source : Observsble<Observable<String>>

source.merge().subscribe {
    print($0)
}.disposed(by: disposeBag)

var numbers = ["1", "2", "3"]
var alphabets = ["a", "b", "c"]
repeat {
    if !numbers.isEmpty {
        number.onNext("number:  " + numbers.removeFirst())
    } else if !alphabets.isEmpty {
        alphabet.onNext("alphabet: " + alphabets.removeFirst())
    }
} while !numbers.isEmpty || !alphabets.isEmpty
// 1, 2, 3, a, b, c

 

.combineLatest()

.zip()

combineLatest : 두 시퀸스를 합쳐서 한번에 발생, 한쪽 시퀸스는 계속 재 사용

zip : 두 시퀸스 합쳐서 발생하지만 재사용하지 않는다.

let left = PublishSubject<String>()
let right = PublishSubject<Int>()
let observable = Observable
    .combineLatest(left, right, resultSelector: {
//    .zip(left, right, resultSelector: {
        "\($0) \($1)"
})
// 또는 (left, right 모두 String 이라면)
// let observable = Observable.combineLatest([left, right]) { strings in 
//     strings.joined(separator: " ") }

let disposable = observable.subscribe (onNext: { print($0) })
left.onNext("A >>> ")
// combineLatest :  , zip : 
right.onNext(100)
// combineLatest : A >>> 100 , zip : A >>> 100
right.onNext(200)
// combineLatest : A >>> 200 , zip : 
left.onNext("B >>> ")
// combineLatest : B >>> 200 , zip : B >>> 200
disposable.dispose()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형