如何将多个驱动程序与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()这不是打印任何东西.所以我想你需要一种方法来设置初始值来刷新流. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |