Search code examples
iosuitableviewrx-swiftrx-cocoa

RxSwift double mapping in tableView.rx.itemSelected


I want to get object from tableView.rx.itemSelected and after process it. This method return IndexPath, so I can map this value. But how to get object at index from the ViewModel?

struct ViewModel {
    var items: Observable<[Item]>
}

Approximate I expect something like this (but this flow is wrong):

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)

I showed somewhere this possibility, but cant recollect it. Have you some idea how to do it?


Solution

  • If you need both indexPath and the model you could combine the 2 methods and transform them in only one observable sequence:

    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)