【问题标题】:Save Memory when Loading Collection View加载集合视图时节省内存
【发布时间】:2018-08-13 21:06:47
【问题描述】:

将项目从数据库加载到集合视图时,我将如何节省内存?假设我在一个数据库中有超过 10,000 个项目正在被检索(包括图像)到一个集合视图中,同时从数据库中检索多个标签。

我是否必须只检索前 20-50 个项目,然后在用户通过数据时创建一个函数来检索下一组,还是与图像有更多关系?

【问题讨论】:

  • 虽然有一个公认的很好的答案,但更大的问题是,你为什么要一次加载 10,000 个项目?这不会是一个非常好的用户体验 - 考虑加载 15-20 个项目并在用户滚动浏览它们时 分页。SO 上有很多帖子以及一些活泼的 YouTube涵盖该过程的视频。

标签: swift firebase memory google-cloud-firestore


【解决方案1】:

从 iOS 10 开始,您可以通过UICollectionViewDataSourcePrefetching 协议prefetch 数据。

我鼓励您下载示例并尝试一下,但基本上它允许您:

  • 在屏幕需要数据之前获取数据。
  • 异步加载数据。
  • 取消不必要的提取。

就内存问题而言,表视图和集合视图都使用对象池来重用单元视图,并用新数据填充它们。

更具体地说,这是通过在UICollectionViewDataSource 方法collectionView(_:cellForItemAt:) 的实现中调用dequeueReusableCell(withReuseIdentifier:for:) 来实现的

一个例子是这样的:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    // Dequeues an existing cell if one is available, 
    // or creates a new one based on the registered class/nib.
    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.")
    }
    // Configure the cell for display.
    return cell
}

编码愉快:D

【讨论】:

  • 非常感谢!非常翔实和乐于助人!非常感谢您的帮助。
【解决方案2】:

您应该仅在需要时检索数据。 Core Data 已经为您准备好了。看看NSFetchedResultsController

【讨论】:

  • 太棒了。谢谢!
猜你喜欢
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多