iOS RxSwift - 如何使用 Amb 运算符?

Posted

技术标签:

【中文标题】iOS RxSwift - 如何使用 Amb 运算符?【英文标题】:iOS RxSwift - how to use Amb Operator? 【发布时间】:2018-09-02 11:12:23 【问题描述】:

我正在寻找 RxSwift 的 Amb() 运算符示例。

我有两个可观察对象 - 已启动和已停止,我想创建代码,如果其中一个发出,则执行该代码,而忽略另一个发出。

let started = viewModel.networkAPI.filter  result in
            switch result 
            case .success:
                return true
            case .failure:
                return false
            
        

    let stopped = viewModel.networkAPI.filter  result in
        switch result 
        case .success:
            return true
        case .failure:
            return false
        
    

我试过了:

    Observable<Bool>.amb([started, stopped])
//error - Ambiguous reference to member 'amb'
//Found this candidate (RxSwift.ObservableType)
//Found this candidate (RxSwift.ObservableType)

和:

 started.amb(stopped)
//error - Generic parameter 'O2' could not be inferred

如何正确使用 RxSwift AMB 运算符来选择两个 observable 中的一个来首先发出值?

【问题讨论】:

【参考方案1】:

问题不在于您发布的代码。我的猜测是您的 Result 类型是通用的,并且启动和停止的可观察对象正在过滤掉不同类型的结果。从本质上讲,started 和stopped 有不同的类型,因此amb 不能与它们一起使用。

您可以通过执行let foo = [started, stopped] 来测试这一点,然后测试foo 的类型。你可能会得到错误:

异构集合字面量只能推断为'[Any]';如果这是故意的,请添加显式类型注释

//convert both to the same emission type,
//then apply .amb after one of them

let stoppedBoolType = stopped.map  _ -> Bool in
    return false

started.map _ -> Bool in
    return true
    .amb(stoppedBoolType)

【讨论】:

你是对的,我被 .filter 和 .map 弄糊涂了——它们被分成了多行。我需要 .amb 两个布尔可观察对象,并试图在它们的结果被映射之前这样做

以上是关于iOS RxSwift - 如何使用 Amb 运算符?的主要内容,如果未能解决你的问题,请参考以下文章

哪个 RxSwift 运算符用于唯一发出的元素以及如何使用?

RxSwift:使用运算符组合下载照片并保存在本地

在 RxSwift 4.0.0 中正确使用 retryWhen 运算符

在这种情况下使用哪个 rxSwift 运算符?

创建 observables 数组后在 RxSwift 中使用 zip 运算符

RxSwift 在 Zip 运算符中处理 observable