加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何将多个驱动程序与RxSwift正确组合?

发布时间:2020-12-14 04:36:09 所属栏目:百科 来源:网络整理
导读:我正在组合一个viewDidAppear并使用Rx Swift过滤Drivers.他们工作得很好.但是当我介绍第三个驱动程序时,它会停止在最新的组合上调用flatMapLatest. 在我的View Controller中,我有以下驱动程序: let filter: DriverStringlet viewDidAppear: DriverVoidlet r
我正在组合一个viewDidAppear并使用Rx Swift过滤Drivers.他们工作得很好.但是当我介绍第三个驱动程序时,它会停止在最新的组合上调用flatMapLatest.

在我的View Controller中,我有以下驱动程序:

let filter: Driver<String>
let viewDidAppear: Driver<Void>
let refresh: Driver<Void>

在我的视图模型中:

// On viewDidAppear,I download a list of portfolios

let viewDidAppearPortfolios = viewDidAppear
    .flatMapLatest({ (_) -> Driver<Result<[PortfolioModel]>> in        
        return networkService.request(Router.portfolios)!
            .responseCollections()
            .trackActivity(fetching)
            .asDriver(onErrorJustReturn: .failure(NSError()))

    })
    .flatMapLatest({ (result: Result<[PortfolioModel]>) -> Driver<[PortfolioModel]> in

        switch result {
        case .success(let value): return Driver.just(value)
        case .failure(_): return Driver.just([])
        }

    })

// Then I combine with a filter from my search bar.

self.portfolios = Driver.combineLatest(viewDidAppearPortfolios,filter)
    .flatMapLatest { (portfolios: [PortfolioModel],filter: String) -> Driver<[PortfolioModel]> in

        if filter.isEmpty {
            return Driver.just(portfolios)
        }

        return Driver.just(portfolios.filter({ (portfolio) -> Bool in
            portfolio.portfolio.localizedCaseInsensitiveContains(filter)
        }))

    }

以上作品!

网络请求一个投资组合列表,我能够在我输入客户端时过滤这些结果.

但是,我希望用户拉动刷新,并再次触发网络请求!所以,我结合我的刷新驱动程序.

还有这个:

Driver.combineLatest(viewDidAppearPortfolios,filter)

变成这样:

Driver.combineLatest(viewDidAppearPortfolios,filter,refresh)

问题!

结合刷新后,不再在viewDidAppear上调用flatMapLatest!只有我手动pullToRefresh.

Driver.combineLatest(viewDidAppearPortfolios,refresh).flatMapLatest { _,_,_ in 
    // No longer get's called on viewDidAppear after combining with refresh
}

> viewDidAppearPortfolios仍然执行,因此网络请求
被叫了!
>只有当我手动拉动刷新时才能获得
我之前要求的投资组合清单……

知道为什么吗?

谢谢!

解决方法

看起来您的刷新还没有发出单个事件,因此不计算combineLatest.
我试过这段代码来测试:

let one = Driver.just(1)
let two = Driver.just(2)
let three: Driver<Int> = .just(3)

let result = Driver.combineLatest(one,two,three)
    .flatMapLatest {
        return Driver.just($0 + $1 + $2)
    }

result.drive(onNext: {
    print($0)
})

这打印6但是如果你使用let 3:Driver< Int> = .empty()这不是打印任何东西.所以我想你需要一种方法来设置初始值来刷新流.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读