如何正确组合多个驱动程序与RxSwift?
问题描述:
我将viewDidAppear
和filter
驱动程序与RxSwift结合在一起。他们工作得很好。但是,当我介绍第三个驱动程序时,它会停止在最新的组合程序上调用flatMapLatest
。如何正确组合多个驱动程序与RxSwift?
在我的视图控制器,我有这些驱动程序:
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)
}))
}
上述作品!
网络请求组合列表,并我能够为我打字,客户端过滤这些结果。
不过,我想为用户拉刷新,并TRIGER网络再次请求!所以,我与我的刷新驱动程序结合起来。
这:
Driver.combineLatest(viewDidAppearPortfolios, filter)
变为这样:
Driver.combineLatest(viewDidAppearPortfolios, filter, refresh)
问题!
与refresh
的flatMapLatest
合并后不再呼吁viewDidAppear!只有当我手动pullToRefresh。
Driver.combineLatest(viewDidAppearPortfolios, filter, refresh).flatMapLatest { _,_,_ in
// No longer get's called on viewDidAppear after combining with refresh
}
- 的
viewDidAppearPortfolios
仍然执行,所以网络请求 获取调用! - 只有当我手动拉刷新做到,我感到我先前请求组合的 列表...
任何想法,为什么?
谢谢!
答
看起来您的refresh
尚未发出单个事件,因此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 three: Driver<Int> = .empty()
这不是什么打印。所以我想你需要一种方法来设置一个初始值为refresh
流。
就是这样,谢谢。在我的例子中,我添加了'startWith'到我的refreshControl:'refreshControl.rx.controlEvent(.valueChanged).startWith(())。asDriver(onErrorJustReturn:())' – nmdias