可观察的提前处置

时间:2017-04-28 19:09:59

标签: swift rx-swift rxdatasources

我认为如果我解释一下我想要实现的目标会更好,因为我认为错误在于我对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,我想更新模型。关于如何实现这一目标的任何想法?

抱歉这么大的问题。

1 个答案:

答案 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 {。然后,您的来源将是按钮或用户点击的任何内容,从而导致网络更新无法完成,直至其被删除。

(以上是未经测试的代码,但它应该让您了解所需的形状。)