MVVMを用いる際には、ViewControllerがViewModelの変更を受け取り、UITableViewCellなどはそれらの値をただ画面に描画するという実装がベターではないかと思います。
つまり、以下のような流れになります。
- UITableViewCell上のいいねボタンのタップイベントを受け取り、ViewModelに伝達する。
- ViewModelは受け取ったイベントをもとに、いいねに関するモデルのメソッドを実行する。
- モデルの実行結果を受け取り、対応するデータに対して更新処理を行う。
- 更新されたデータに対応するCellのReloadを実行する。
よって、UITableViewCellは
- いいねのタップイベントを受け取る
- いいねの状態を描画する
の処理のみを実装するだけで良くなるはずです。
また、Cell上のボタンタップの伝達は以下のような実装になります。
takeUntilとprepareForReuseを利用することでcellがreuseされるタイミングでDisposeされるので、DisposeBagの扱いを気にする必要がなくなります。
swift
1func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
2 let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
3 let prepareForReuse = cell.rx.sendMessage(#selector(UITableViewCell.prepareForReuse))
4
5 _ = cell.likeButton.rx.tap
6 .takeUntil(prepareForReuse)
7 .map { _ in indexPath }
8 .concat(Observable.never()) // onCompleteが流れて、bind先がonCompleteしてしまうことを防ぐ
9 .bind(to: viewModel.likeWithIndexPath)
10
11 return cell
12}