3

我认为如果我解释我想要实现的目标会更好,因为我认为错误在于我对 Observables 如何工作的误解。

我有一个包含 UITableView 的 UIViewController 我也在使用 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]>

这一切都在第一次很好,tableview 显示项目,但来自debug()的打印:

2017-04-28 20:07:21.382: MarketAndLanguageSelectionViewController.swift:36 (viewDidLoad()) -> subscribed
2017-04-28 20:07:22.287: MarketAndLanguageSelectionViewController.swift:36 (viewDidLoad()) -> Event next(*Multiple items*)
2017-04-28 20:07:22.289: MarketAndLanguageSelectionViewController.swift:36 (viewDidLoad()) -> Event completed
2017-04-28 20:07:22.289: MarketAndLanguageSelectionViewController.swift:36 (viewDidLoad()) -> isDisposed

问题是我不想处理数据源,因为我不想根据用户操作来更新它。如果用户单击 tableViewCell 我想更新模型。关于如何实现这一目标的任何想法?

对不起这么大的问题。

4

1 回答 1

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 {。然后,您的来源将是按钮或用户点击的任何内容,以导致网络更新在删除之前不会完成。

(上面是未经测试的代码,但它应该让您了解您想要的形状。)

于 2017-04-28T23:17:59.673 回答