使用RxSwift异步加载UITableView单元

时间:2017-04-03 08:33:26

标签: android ios rx-java rx-swift reactivex

我试图在我的应用中利用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) })
  }

代码中的问题当然是单元可观察单元与外部可观察单元之间缺乏连接,我知道这是一种不好的做法,

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

我考虑使用像KingFisher / SDWebImage这样的库来解决这个次要问题。