在进行实时通信时使用 NSFetchedResultsController 延迟加载旧消息

Lazy loading old messages with NSFetchedResultsController while doing realtime communication

考虑一个聊天应用程序场景,您有一个非常大的群组,其中包含 100,000 多条消息和实时通信。

就像大多数聊天应用程序一样,我们希望最新消息显示在底部,即在底部添加新项目。

  1. NSFetchedResultsController 中使用延迟加载的最佳实践是什么?通过增加 fetchLimit 来更改获取请求似乎不是一个好主意。此外,使用额外的数组而不是 fetchedObject 似乎也不是一个非常优雅或方便的解决方案。

  2. 在底部显示最新消息的最佳做法是什么,即反转 UITableView 方向?转换似乎不是一个优雅的解决方案,是吗?

寻找适合人们的优雅解决方案。请指教

fetchLimit 不适用于 NSFetchedResultsController。要限制控制器,您可以执行以下操作:

  1. 使用 fetchLimit=1 和 fetchOffset=BATCH_SIZE 进行一次提取(其中批量大小很大,但不是很大 = ~200)
  2. 获取您获取的那条消息的日期
  3. 将 fetchedResultsController 限制为该消息的日期。

现在您有一个包含 200 条消息的 fetchedResultsController。请注意,只要它打开,它的大小可能会增加。

当用户向后滚动时,您可以对 fetchedResultsController 进行一些类似的调整,方法是进行提取以找出正确的日期范围。

为了显示单元格,我使用了双反方法(对 collectionView 应用 180 度旋转,对每个单元格应用 180 度旋转)。它不是那么优雅,但它可以工作,而且它并不像最初看起来那么昂贵 - 无论如何,整个屏幕已经在幕后的 openGL 层中。它导致了很多小问题(比如 scrollIndicator 在错误的一侧),但也修复了很多小问题(比如处理消息很少的聊天)。如果我必须再做一次,我会做一个自定义布局,但我不会那么快就放弃双反方法。