gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 08:17:30 27 4
gpt4 key购买 nike

我将 viewDidAppearfilter 驱动程序与 RxSwift 相结合。他们工作得很好。但是,当我引入第三个驱动程序时,它会停止在最新的联合收割机上调用 flatMapLatest

在我的 View Controller 中,我有这些驱动程序:

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

在我的 View 模型中:

// 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)

问题!

refresh 结合后,flatMapLatest 不再在 viewDidAppear 上调用!仅当我手动 pullToRefresh 时。

Driver.combineLatest(viewDidAppearPortfolios, filter, refresh).flatMapLatest { _,_,_ in 
// No longer get's called on viewDidAppear after combining with refresh
}
  1. viewDidAppearPortfolios 仍在执行,因此网络请求正在被调用!
  2. 只有当我手动拉动刷新时,我才会得到我之前要求的投资组合列表...

知道为什么吗?

谢谢!

最佳答案

它看起来像你的 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流。

关于swift - 如何将多个驱动程序与 RxSwift 正确组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45040193/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com