【问题标题】:How to reload data for a single tableview cell using RXSwift如何使用 RXSwift 为单个 tableview 单元重新加载数据
【发布时间】:2021-01-25 14:04:05
【问题描述】:

我有一个表格视图,其单元格绑定到 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)

现在,如果其中一个 listItems 发生了变化,我只想更新那个单元格。我该怎么做呢,我是 RXSwift 的新手。

【问题讨论】:

  • subscribeOnshare 在这种情况下什么都不做,应该被删除。你的列表项对象有任何类型的 id 值吗?
  • 我继承了这段代码,我是 RXSwift 的新手。我不确定 share() 做了什么,我认为 subscribeOn 是为了在后台线程上发生一些事情。 ListItem 没有任何 ID。

标签: swift tableview rx-swift


【解决方案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 并在它们观察到的列表项更新时更新。

【讨论】:

    猜你喜欢
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多