在我的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正确组合?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)