使用 RxSwift 异步加载 UITableView 单元格

Posted

技术标签:

【中文标题】使用 RxSwift 异步加载 UITableView 单元格【英文标题】:Async loading of UITableView cells with RxSwift 【发布时间】:2017-04-03 08:33:25 【问题描述】:

我正在尝试在我的应用程序中利用 RxSwift。其中一个用例是由搜索按钮(或单元格的回收)触发的图像 UITableView 的异步加载。我不能很好地工作是丢弃以前的结果。

保持正确的加载顺序对我来说很重要,并且能够丢弃对不需要的图像的网络请求

我正在研究 RxSwift,但这可能适用于 RxJava 和 android RecyclerView

当前状态的伪代码是:

myModel
  .searchString
  .debounce(0.3)
  .distinctUntilChanged()
  .flatMapLatest( return fetchImageUrlsFromNetwork($0) )
  .bindTo(tableView.rx.items)  (url,cell,...) in
     reactivelyLoadUrl(url)
        .subscribe( cell.imageView.image = UIImage(data:$0) )
  

代码中的问题,当然是cell observable和outer observable之间缺乏联系,我知道这是一种不好的做法,

但我不确定如何将 UITableView 的 RxCocoa 绑定与单元格异步加载结合使用。在滚动和循环单元格时,tableview 的内部使用负载这一事实也给这种情况增加了一些复杂性。

同样重要的是,我不必事先加载所有 tableview 数据,因此同时显示所有单元格图像。

我正在考虑可能为每个 tableview 索引创建一个全局可观察对象,因此当 UI 引擎需要它时(由回收或搜索引擎结果回调触发),请求将进入一个序列,该序列与 @987654322 一起应用@ 运算符,因此加载会保留每个单元格的顺序,但它不是那么优雅。

结果是,如果我快速运行几个搜索查询,我有时会看到以前的图片加载会覆盖新的加载。

【问题讨论】:

【参考方案1】:

RxSwift 可以帮助您解决许多具有挑战性的问题。就我个人而言,我发现这个特别的不是一个。我觉得在使用 Rx 时将结果从模型加载到表视图中是微不足道的和干净的。要返回该 tableView 的关联数据,尽管 after 不是。

我会考虑使用 KingFisher / SDWebImage 等库来解决这个次要问题。

【讨论】:

以上是关于使用 RxSwift 异步加载 UITableView 单元格的主要内容,如果未能解决你的问题,请参考以下文章

使用 RxSwift 同步异步网络调用

使用 RxSwift 的异步任务和多个观察者

Swift - RxSwift的使用详解32(UITableView的使用3:刷新表格数据)

RXSwift 简单的异步示例?

RxSwift - 执行控制流会导致异步操作被执行两次

RxSwift 如何知道 TableView 重新加载结束