我认为如果我解释一下我想要实现的目标会更好,因为我认为错误在于我对Observables的工作方式的误解。
我有一个UIViewController包含一个UITableView我也使用RxSwift和RxDataSources,所以我绑定了我的tableView项目如下:
EmpID EmpName EmpCategory Sequence
1 A 12 1
2 B 14 2
3 C 15 3
4 D 16 4
5 E 12 5
6 F 12 6
7 G 12 7
vm 是一个viewModel,其中包含:
vm.model
.debug()
.drive(tableView.rx.items(dataSource: dataSource))
.disposed(by: disposeBag)
模型是:
self.model = self.network.provider.getMarkets()
.map { (markets: [Market]) -> [Row] in
var rows = [Row]()
for market in markets {
rows.append(.market(market: market))
}
return rows
}
.map { (rows: [Row]) -> [Model] in
return [Model(section: .market, items: rows)]
}
.shareReplay(1)
.asDriver(onErrorJustReturn: [])
这一切都很有效,第一次,tableview显示项目,但来自 debug()的打印:
var model: Driver<[Model]>
问题是我不想要处理数据源,因为我不想根据用户操作更新数据源。如果用户单击tableViewCell,我想更新模型。关于如何实现这一目标的任何想法?
抱歉这么大的问题。
答案 0 :(得分:2)
我猜测network.provider.getMarkets()
进行网络调用,返回单个结果并完成。
现在,getMarkets()
是来源,tableView.rx.items
是接收器。一旦源完成,链就会被破坏。
听起来你想要做的就是每次用户点击某个内容时创建一个新的getMarkets
Observable,以及免费调用getMarkets
一次。我希望有类似的东西:
let markets = trigger.flatMap {
self.network.provider.getMarkets()
}.map { (markets: [Market]) -> [Row] in
var rows = [Row]()
for market in markets {
rows.append(.market(market: market))
}
return rows
}.map { (rows: [Row]) -> [Model] in
return [Model(section: .market, items: rows)]
}.startWith(self.network.provider.getMarkets())
.shareReplay(1)
.asDriver(onErrorJustReturn: [])
请注意,唯一真正的区别是开始trigger.flatMap {
。然后,您的来源将是按钮或用户点击的任何内容,从而导致网络更新无法完成,直至其被删除。
(以上是未经测试的代码,但它应该让您了解所需的形状。)