在进行实时通信时使用 NSFetchedResultsController 延迟加载旧消息
Lazy loading old messages with NSFetchedResultsController while doing realtime communication
考虑一个聊天应用程序场景,您有一个非常大的群组,其中包含 100,000 多条消息和实时通信。
就像大多数聊天应用程序一样,我们希望最新消息显示在底部,即在底部添加新项目。
在 NSFetchedResultsController
中使用延迟加载的最佳实践是什么?通过增加 fetchLimit
来更改获取请求似乎不是一个好主意。此外,使用额外的数组而不是 fetchedObject
似乎也不是一个非常优雅或方便的解决方案。
在底部显示最新消息的最佳做法是什么,即反转 UITableView
方向?转换似乎不是一个优雅的解决方案,是吗?
寻找适合人们的优雅解决方案。请指教
fetchLimit
不适用于 NSFetchedResultsController
。要限制控制器,您可以执行以下操作:
- 使用 fetchLimit=1 和 fetchOffset=BATCH_SIZE 进行一次提取(其中批量大小很大,但不是很大 = ~200)
- 获取您获取的那条消息的日期
- 将 fetchedResultsController 限制为该消息的日期。
现在您有一个包含 200 条消息的 fetchedResultsController。请注意,只要它打开,它的大小可能会增加。
当用户向后滚动时,您可以对 fetchedResultsController
进行一些类似的调整,方法是进行提取以找出正确的日期范围。
为了显示单元格,我使用了双反方法(对 collectionView 应用 180 度旋转,对每个单元格应用 180 度旋转)。它不是那么优雅,但它可以工作,而且它并不像最初看起来那么昂贵 - 无论如何,整个屏幕已经在幕后的 openGL 层中。它导致了很多小问题(比如 scrollIndicator 在错误的一侧),但也修复了很多小问题(比如处理消息很少的聊天)。如果我必须再做一次,我会做一个自定义布局,但我不会那么快就放弃双反方法。
考虑一个聊天应用程序场景,您有一个非常大的群组,其中包含 100,000 多条消息和实时通信。
就像大多数聊天应用程序一样,我们希望最新消息显示在底部,即在底部添加新项目。
在
NSFetchedResultsController
中使用延迟加载的最佳实践是什么?通过增加fetchLimit
来更改获取请求似乎不是一个好主意。此外,使用额外的数组而不是fetchedObject
似乎也不是一个非常优雅或方便的解决方案。在底部显示最新消息的最佳做法是什么,即反转
UITableView
方向?转换似乎不是一个优雅的解决方案,是吗?
寻找适合人们的优雅解决方案。请指教
fetchLimit
不适用于 NSFetchedResultsController
。要限制控制器,您可以执行以下操作:
- 使用 fetchLimit=1 和 fetchOffset=BATCH_SIZE 进行一次提取(其中批量大小很大,但不是很大 = ~200)
- 获取您获取的那条消息的日期
- 将 fetchedResultsController 限制为该消息的日期。
现在您有一个包含 200 条消息的 fetchedResultsController。请注意,只要它打开,它的大小可能会增加。
当用户向后滚动时,您可以对 fetchedResultsController
进行一些类似的调整,方法是进行提取以找出正确的日期范围。
为了显示单元格,我使用了双反方法(对 collectionView 应用 180 度旋转,对每个单元格应用 180 度旋转)。它不是那么优雅,但它可以工作,而且它并不像最初看起来那么昂贵 - 无论如何,整个屏幕已经在幕后的 openGL 层中。它导致了很多小问题(比如 scrollIndicator 在错误的一侧),但也修复了很多小问题(比如处理消息很少的聊天)。如果我必须再做一次,我会做一个自定义布局,但我不会那么快就放弃双反方法。