Как реализовать в RXswift и RXCocoa UITableView внутри ячейки tableview?

Я новичок в RXswift и в настоящее время работаю в проекте, который требует rxswift с UITableView внутри UITableViewCell

Ниже приведены некоторые из кодов, которые я сделал до сих пор, но каждый раз при прокрутке вверх / вниз он не показывает правильное значение.

    var disposeBag = DisposeBag()

    viewModel.listExperience.asObservable().bind(to: tableView.rx.items(cellIdentifier: cellExperienceTableViewCell.getCellId(), cellType: ExperienceTableViewCell.self)){
            row , data, cell in

             cell.lblTitle.text = data.title ?? ""
             cell.lblDate.text = data.startDate ?? ""
             cell.lblDetails.text = data.body ?? ""

            let filtered = self.viewModel.getDataCommentInRow(row) /* returns Variable<[Comments]> */
             cell.setCommentTableView(row: row, filtered: filtered)
             cell.tableViewOffset = self.storedOffsets[row] ?? 0
             cell.tableViewComments.reloadData()

           }.disposed(by: disposeBag)

вот код tableView внутри моей ячейки tableView

  func setCommentTableView(row : Int, filtered  : Variable<[ExperienceComment]>){

    tableViewComments.tag = row
    filtered.asObservable().bind(to: tableViewComments.rx.items(cellIdentifier: commentCell.getCellId(), cellType: CommentCell.self)){  indexPath , data, cell in
        cell.lblComment.text = data.body
      }.disposed(by: disposeBag)
}

Кто-нибудь знает, как этого добиться? Благодарность


person Keith Randell Gapusan    schedule 21.08.2018    source источник


Ответы (1)


Я думаю, что единственное, что вам нужно сделать, это добавить метод prepareForReuse в ячейку табличного представления. В него добавьте disposeBag = DisposeBag(). Для этого убедитесь, что ваш DisposeBag - это переменная внутри ячейки.

Если я прав, проблема в том, что при повторном использовании ячейки она начинает чтение из нескольких filtered наблюдаемых, потому что все они привязаны к одной и той же таблицеViewComments.

person Daniel T.    schedule 21.08.2018
comment
Спасибо, я забыл добавить сюда объявления disposeBag, но я объявил disposeBag вне этого метода (один внутри моего TableViewCell и один внутри моего viewController). Если я прав, проблема в том, что при повторном использовании ячейки она начинает чтение из нескольких отфильтрованных наблюдаемых, потому что все они привязаны к одной и той же tableViewComments. Да, именно это и случилось с моей tableviewCell. Я проверю, что "prepareForResue", спасибо, Даниэль - person Keith Randell Gapusan; 22.08.2018
comment
Верно, поэтому замена вашего disposeBag в prepareForReuse приводит к завершению текущих привязок, которые он удерживает, и подготавливает ячейку для новой привязки. Помните, что способ закрыть Observable pipe - это либо завершить / ошибку производителя, либо потребителя удалить соединение. - person Daniel T.; 22.08.2018
comment
Спасибо, Даниэль, я добавил, что добавил disposeBag внутри prepareForReuse в ячейку tableView, и теперь все в порядке. :) - person Keith Randell Gapusan; 24.08.2018
comment
Рад это слышать. Помните, что вы не добавляете пакет для утилизации в prepareForReuse. Скорее вы заменяете пакет для утилизации (тем самым удаляя старый и избавляясь от всего, что в нем). Вот почему это работает. - person Daniel T.; 24.08.2018