有没有办法-preload- UICollectionViewCell?

时间:2016-09-25 13:11:23

标签: ios uicollectionview uicollectionviewcell

长时间困扰我的东西。

有没有办法预加载UICollectionViewCell? 在加载数据之前要准备的东西,因此在用户滚动时不会创建单元格。

有没有办法对WHEN进行完全控制以创建UICollectionViewCell,何时可以销毁UICollectionViewCell。

3 个答案:

答案 0 :(得分:1)

来自TwigJS

  

您通常不会自己创建此类的实例。而是使用集合视图对象注册特定的单元子类(或包含已配置的类实例的nib文件)。如果需要单元类的新实例,请调用集合视图对象的dequeueReusableCell(withReuseIdentifier:for :)方法来检索它。

细胞本身并不是一个沉重的资源,所以定制它的生命周期有点意义。 我认为不应该寻找一种控制细胞创建的方法,而应该问自己:为什么要预加载细胞?你想加载什么样的重型资源? 根据答案,您可以尝试以下优化:

  • 如果您的单元格中有复杂的视图层次结构,请考虑从Autolayout重构为手动设置框架
  • 如果您的单元格应显示某些复杂计算或远程图像的结果,您希望有一个单独的体系结构层来加载这些资源,并且无论如何都不应该在单元类中进行。必要时使用缓存。

答案 1 :(得分:0)

当您进入场景并导航(滚动)到每个单元格类型时,您可以使屏幕变黑。当您滚动每个单元格时,您应该隐藏遮光视图并在第一个单元格(顶部)上显示集合视图。

这是某种解决方法。我的单元格有很多像图像这样的资源,在滚动集合视图时会滞后。

答案 2 :(得分:0)

我可以添加一些实际方法

如果您需要从Internet /核心数据结帐https://developer.apple.com/documentation/uikit/uicollectionviewdatasourceprefetching/prefetching_collection_view_data中预加载一些数据

tl; dr

首先,除了 UICollectionViewDataSource 协议

之外,您还需要您的集合视图数据源符合 UICollectionViewDataSourcePrefetching

然后预取数据并将其存储在缓存中

func collectionView(_ collectionView: UICollectionView, prefetchItemsAt indexPaths: [IndexPath]) {
    // Begin asynchronously fetching data for the requested index paths.
    for indexPath in indexPaths {
        let model = models[indexPath.row]
        asyncFetcher.fetchAsync(model.id)
    }
}

最后向您的单元格提供缓存的数据

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: Cell.reuseIdentifier, for: indexPath) as? Cell else {
        fatalError("Expected `\(Cell.self)` type for reuseIdentifier \(Cell.reuseIdentifier). Check the configuration in Main.storyboard.")
    }

    let model = models[indexPath.row]
    let id = model.id
    cell.representedId = id

    // Check if the `asyncFetcher` has already fetched data for the specified identifier.
    if let fetchedData = asyncFetcher.fetchedData(for: id) {
        // The data has already been fetched and cached; use it to configure the cell.
        cell.configure(with: fetchedData)
    else
        ... async fetch and configure in dispatch main asyncd

,您可以使用委托方法来处理willDisplay,didEndDisplay事件等一些变通方法,例如https://developer.apple.com/documentation/uikit/uicollectionviewdelegate/1618087-collectionview?language=objc