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

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

概述我正在组合一个viewDidAppear并使用Rx Swift过滤Drivers.他们工作得很好.但是当我介绍第三个驱动程序时,它会停止在最新的组合上调用flatMapLatest. 在我的View Controller中,我有以下驱动程序: let filter: Driver<String>let viewDidAppear: Driver<Void>let refresh: Driver 我正在组合一个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 portfolioslet 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( +  + )    }result.drive(onNext: {    print()})

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

总结

以上是内存溢出为你收集整理的如何将多个驱动程序与RxSwift正确组合?全部内容,希望文章能够帮你解决如何将多个驱动程序与RxSwift正确组合?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1005042.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存