tableView.rx.itemSelected 中的 RxSwift 双映射

Posted

技术标签:

【中文标题】tableView.rx.itemSelected 中的 RxSwift 双映射【英文标题】:RxSwift double mapping in tableView.rx.itemSelected 【发布时间】:2017-10-02 07:20:53 【问题描述】:

我想从tableView.rx.itemSelected 获取对象并对其进行处理。这个方法返回IndexPath,所以我可以映射这个值。但是如何从ViewModel获取索引处的对象呢?

struct ViewModel 
    var items: Observable<[Item]>

大概是这样的(但这个流程是错误的):

tableView.rx.itemSelected
        .map  indexPath -> Item in 
        return viewModel.items.map $0[indexPath.row]
        
        ..subscribe(onNext:  [unowned self] item in
        //other actions with Item object
        )
        .disposed(by: disposeBag)

我在某处展示了这种可能性,但不记得了。你知道怎么做吗?

【问题讨论】:

你为什么不在map函数中返回viewModel.items[indexPath.row] @NikitaErmolenko 在这种情况下我得到错误:类型'Observable'没有下标成员 viewModel.items是什么类型的? 它是:var items: Observable 【参考方案1】:

如果您同时需要indexPathmodel,您可以将这两种方法结合起来,并将它们转换为一个可观察的序列:

Observable
    .zip(tableView.rx.itemSelected, tableView.rx.modelSelected(String.self))
    .bind  [unowned self] indexPath, model in
        self.tableView.deselectRow(at: indexPath, animated: true)
        print("Selected " + model + " at \(indexPath)")
    
    .disposed(by: disposeBag)

【讨论】:

不是最优解,因为***.com/a/60926473/7104327 Here【参考方案2】:

RxCocoa 有 2 个方法:

public var itemSelected: ControlEvent&lt;IndexPath&gt; get 返回所选项目的IndexPathpublic func modelSelected&lt;T&gt;(_ modelType: T.Type) -&gt; ControlEvent&lt;T&gt; 返回模型元素 根据您的示例,它将看起来:

    tableView.rx.modelSelected(Item.self)
        .subscribe(onNext:  [weak self] item in
            // other actions with Item object
        ).addDisposableTo(disposeBag)

【讨论】:

感谢您的评论。你是对的关于第二个流程。我已经使用它,但我想增加我的理解。因此询问 itemSelected 处理。【参考方案3】:

我还找到了其他方式在itemSelected 命令之后添加do(onNext:...)

tableView.rx
    .itemSelected
    .do(onNext:  [unowned self] indexPath in
        self.tableView.deselectRow(at: indexPath, animated: false)
    )
    .map  indexPath -> Item in 
        return viewModel.items.map $0[indexPath.row]
    
    .subscribe(self.viewModel.reviewTimeAction.inputs)
    .disposed(by: disposeBag)

【讨论】:

以上是关于tableView.rx.itemSelected 中的 RxSwift 双映射的主要内容,如果未能解决你的问题,请参考以下文章