如何将 sizeForItemAt 放在后台线程上?

Posted

技术标签:

【中文标题】如何将 sizeForItemAt 放在后台线程上?【英文标题】:How can I put sizeForItemAt on a background thread? 【发布时间】:2018-08-27 22:37:36 【问题描述】:

我正在尝试根据图片的纵横比以及其他因素来动态调整单元格的大小,以创建自定义布局。这些计算似乎减慢了我的应用程序的加载速度。我想将此进程移至后台线程。下面是函数的代码。是否可以在后台线程上运行它,提供一个临时单元格大小,直到计算完成,以免降低应用程序的整体性能,谢谢您的帮助。

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize 

  return self.collectionViewSizeCalculator!.sizeForPhoto(at: indexPath)
        

【问题讨论】:

【参考方案1】:

UICollectionView(或UITableView)具有返回值的委托和数据源方法必须在调用它的主队列上返回一个值,并且该返回值应立即计算(或尽可能接近)立即)。任何延迟都会导致集合视图(或表格视图)出现延迟。

一种解决方案是将像元大小存储为数据模型的一部分。最初使用初始估计大小填充大小。让您的 sizeForItemAt 返回您当前在数据模型中拥有的任何大小。

同时,在后台运行一个进程(针对所有单元格或根据需要单独为每个单元格执行此操作)以计算单元格的实际大小。当您取回实际值时,更新数据模型并将该单元重新加载到主队列中。

【讨论】:

我困惑的部分是如何让它在后台更新单元格,以及如何知道后台线程上的进程何时完成。 您不会在后台更新单元格。所有 UI 更新必须在主队列上完成。 非常感谢您的所有帮助,它现在加载得更好了。

以上是关于如何将 sizeForItemAt 放在后台线程上?的主要内容,如果未能解决你的问题,请参考以下文章

iOS:如何让后台线程在主线程上重绘视图

CollectionView SizeForItemAt 基于 Cell 类?

WinForm 中如何使用后台线程来操作UI

UICollectionView sizeForItemAt 调用但大小不正确

多线程与服务的典型用例是啥?

如何在后台线程上创建 NSTimer?