web-dev-qa-db-ja.com

tableView.rx.itemSelectedのRxSwiftダブルマッピング

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)

私はどこかにこの可能性を示しましたが、それを思い出すことはできません。それを行う方法について何か考えがありますか?

8

indexPathmodelの両方が必要な場合は、2つのメソッドを組み合わせて、1つの監視可能なシーケンスのみに変換できます。

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)
33
Eduard

RxCocoaには2つの方法があります。

_public var itemSelected: ControlEvent<IndexPath> { get }_選択したアイテムのIndexPathを返します
そして
public func modelSelected<T>(_ modelType: T.Type) -> ControlEvent<T>はモデル要素を返します
あなたの例によれば、次のようになります:

_    tableView.rx.modelSelected(Item.self)
        .subscribe(onNext: { [weak self] item in
            // other actions with Item object
        }).addDisposableTo(disposeBag)
_
8
Igor Kotkovets

また、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)
1