使用 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 单元格的主要内容,如果未能解决你的问题,请参考以下文章