长时间困扰我的东西。
有没有办法预加载UICollectionViewCell? 在加载数据之前要准备的东西,因此在用户滚动时不会创建单元格。
有没有办法对WHEN进行完全控制以创建UICollectionViewCell,何时可以销毁UICollectionViewCell。
答案 0 :(得分:1)
来自TwigJS:
您通常不会自己创建此类的实例。而是使用集合视图对象注册特定的单元子类(或包含已配置的类实例的nib文件)。如果需要单元类的新实例,请调用集合视图对象的dequeueReusableCell(withReuseIdentifier:for :)方法来检索它。
细胞本身并不是一个沉重的资源,所以定制它的生命周期有点意义。 我认为不应该寻找一种控制细胞创建的方法,而应该问自己:为什么要预加载细胞?你想加载什么样的重型资源? 根据答案,您可以尝试以下优化:
答案 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