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

How can I put sizeForItemAt on a background thread?

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

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

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

UICollectionView(或 UITableView)具有 return 值的委托和数据源方法必须在调用它的主队列上具有 returned 值on 并且 return 值应该立即计算(或尽可能接近立即计算)。任何延迟都会导致集合视图(或 table 视图)滞后。

一种解决方案是将像元大小存储为数据模型的一部分。最初使用初始估计大小填充大小。让您的 sizeForItemAt return 无论数据模型中当前的大小如何。

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