Как перезагрузить данные для одной ячейки tableview с помощью RxSwift

#swift #tableview #rx-swift

#swift #просмотр таблицы #rx-swift

Вопрос:

У меня есть tableview, ячейки которого привязаны к listItemRelay следующим образом:

 viewModel?.listItemsRelay
        .subscribeOn(ConcurrentDispatchQueueScheduler(qos: .userInitiated))
        .share()
        .observeOn(MainScheduler.instance)
        .bind(to: cardTableView.rx.items(cellIdentifier: CardCell.identifier, cellType: CardCell.self))({ [weak self] index, listItem, cell in
            self?.update(cell: cell, at: index, with: listItem)
        })
        .disposed(by: disposeBag)
 

Теперь, если один из списков изменился, и я хочу обновить только эту ячейку. Как бы мне это сделать здесь, я вроде как новичок в RxSwift.

Комментарии:

1. subscribeOn share и ничего не делают в этом контексте и должны быть удалены. Имеет ли ваш объект элемента списка какое-либо значение идентификатора?

2. Я унаследовал этот код, и я новичок, когда дело доходит до RxSwift. Я не уверен, что делает share(), и я предположил, что subscribeOn должен был заставить что-то произойти в фоновом потоке. У ListItem нет идентификаторов.

Ответ №1:

Простой ответ — использовать RxDataSources, который обновит только те ячейки, которые действительно изменяются.

Домашнее решение состоит в том, чтобы использовать другую наблюдаемую, которую наблюдают ячейки, чтобы определить, каким должно быть их содержимое:

 viewModel?.listItemIdsRelay
    .observe(on: MainScheduler.instance)
    .bind(to: cardTableView.rx.items(cellIdentifier: CardCell.identifier, cellType: CardCell.self))({ [unowned self] index, id, cell in
        self.viewModel!.listItemsRelay
            .compactMap { $0[id] }
            .bind { listItem in
                self.update(cell: cell, at: index, with: listItem)
            }
            .disposed(by: cell.disposeBag)
    })
    .disposed(by: disposeBag)
 

listItemIdsRelay Сообщает TableView, какие элементы списка отображать, и обновляется только при добавлении или удалении элемента из массива. Ячейки отслеживают listItemsRelay и обновляются всякий раз, когда элемент списка, за которым они наблюдают, обновляется.