디폴트로 combineLatest를 사용하고 특정한 경우에만 zip을 사용하기
둘다 두 Observable을 합칠때 사용하지만, 합치는 방식이 다르다.
*Single의 경우 zip만 사용가능
1, 2, 3
이 방출되었고, b Observable에서 1, 2
가 방출되었다면 합친 결과는 1-1, 2-2
가 된다. a Observable의 3
은 짝이 없어서 합쳐지지 않는다.Observable의 변형인 Traits의 한 종류인 Completable을 zip으로 묶어서 나오는 이벤트를 구독하여, 두 Completable에서 onCompleted 이벤트가 둘다 내려오면 하나의 Completable 이벤트를 발생시킨다.
Completable.zip(
remoteDataSource.delete(project),
localDataSource.delete(project)
).subscribe(onCompleted: { [self] in
var currentProjects = projects.value
if let row = currentProjects.firstIndex(where: { $0.id == project.id }) {
currentProjects.remove(at: row)
}
projects.accept(currentProjects)
}).disposed(by: disposeBag)
1
만 나온 상태일때는 아무런 이벤트도 발생하지 않는다.따라서 두 Observable의 요소가 하나씩 방출되고 나서는 한 Observable에서 요소가 방출될때마다 합쳐진 시퀀스에서 이벤트가 발생한다.
1, 2
두개씩 나온 상태일때 b Observable에서 3
이 나오면 a Observable의 가장 최신 요소인 2
와 합쳐진다.import RxSwift
import Foundation
func exampleZip(a: Observable<Int>) -> Observable<(Int, String)> {
let b = a.map { "\($0)" }
return Observable.zip(a, b)
}
func exampleCombineLatest(a: Observable<Int>) -> Observable<(Int, String)> {
let b = a.map { "\($0)" }
return Observable.combineLatest(a, b)
}
exampleZip(a: Observable.from([1, 2, 3]))
.subscribe(onNext: { print("zip", $0) })
exampleCombineLatest(a: Observable.from([1, 2, 3]))
.subscribe(onNext: { print("combineLatest", $0) })
zip (1, "1")
zip (2, "2")
zip (3, "3")
combineLatest (1, "1")
combineLatest (2, "1")
combineLatest (2, "2")
combineLatest (3, "2")
combineLatest (3, "3")
https://reactivex.io/documentation/operators/combinelatest.html
https://reactivex.io/documentation/operators/zip.html