Swift 可观察的被提前处理的

Swift 可观察的被提前处理的,swift,rx-swift,rxdatasources,Swift,Rx Swift,Rxdatasources,我认为如果我解释一下我试图实现的目标会更好,因为我认为错误在于我对观测值如何工作的误解 我有一个UIViewController,其中包含一个UITableView。我还使用RxSwift和RxDataSources,所以我绑定tableView项,如下所示: vm.model .debug() .drive(tableView.rx.items(dataSource: dataSource)) .disposed(by: disposeBag) 其中,vm是一个viewModel,它包含:

我认为如果我解释一下我试图实现的目标会更好,因为我认为错误在于我对观测值如何工作的误解

我有一个UIViewController,其中包含一个UITableView。我还使用RxSwift和RxDataSources,所以我绑定tableView项,如下所示:

vm.model
.debug()
.drive(tableView.rx.items(dataSource: dataSource))
.disposed(by: disposeBag)
其中,vm是一个viewModel,它包含:

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: [])
其中模型为:

var model: Driver<[Model]>
问题是我不想处理数据源,因为我不想根据用户操作更新它。如果用户单击tableViewCell,我想更新模型。关于如何实现这一点,有什么想法吗


很抱歉问这么大的问题。

我猜
network.provider.getMarkets()
会进行一次网络调用,返回一个结果并完成

现在,
getMarkets()
是源,而
tableView.rx.items
是接收器。一旦源代码完成,链就会断开

听起来你想做的是创建一个新的
getMarkets
,每次用户点击某个东西时都可以观察到,并且免费调用
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{
。然后,您的源代码将是按钮或用户点击的任何东西,以导致网络更新,直到删除后才会完成


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

谢谢Daniel,但这会在用户每次点击一个单元格时进行网络呼叫,对吗?我想做的只是进行一次网络呼叫,然后每次用户点击一个单元格时更改网络呼叫生成的模型,这反过来会更新TableView,你说,“如果用户单击tableViewCell,我想更新模型。"是的,也许我解释错了:)我打了一个初始电话,从那个电话我将数据映射到一个特定的模型,然后将数据传送到tableView。当用户点击一个单元格时,我不想更新同一个模型,但不打网络电话,这是有意义的吗?很抱歉,我很感谢你的帮助啊…你需要定义所有的方法模型可以更改并为每个模型创建一个可观察对象,然后将这些可观察对象合并在一起。这是您的
模型
,而不仅仅是网络调用。
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: [])