#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
и обновляются всякий раз, когда элемент списка, за которым они наблюдают, обновляется.