首页 > 解决方案 > 在什么情况下可以使用 zip 和 combineLatest?RxSwift

问题描述

我不知道在什么情况下使用 zip 以及在什么情况下使用 combineLatest。有人能帮我吗?

标签: rx-swift

解决方案


zip当您想要组合两个具有共同来源的 Observable 并且您希望等待来自该来源的所有更新之前它发出一个值时,需要该运算符。combineLatest运算符用于所有其他情况。

我建议您将combineLatest其用作默认值,zip如果您知道自己需要它,请使用它。

如果组合的 observables 都是单数,那么这两个运算符是相同的。事实上,如果你使用的Single类型,zip是唯一可用的操作符。

else 的主要用途zip是当您重新订阅另一个正在组合的 observable 所依赖的 observable 时。将其粘贴到正确配置的 Playground 中:

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")

看到不同?


推荐阅读