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

时间:2018-08-27 22:37:36

标签: ios swift uicollectionview grand-central-dispatch uicollectionviewlayout

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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