分组消息类似于 iPhone 消息应用

Grouping messages similar to iPhone Message app

在我们的 iOS 应用程序中,我们使用核心数据并使用 NSFetchedResultsController 将其与 table 视图绑定。该应用程序是关于 "Chat" 功能的。

UI 与 iPhone "Messages" 应用程序相同。当我们点击一​​条消息时,它会显示历史记录以及所有按时间分组的历史记录。其背后的逻辑是,如果前一条消息和当前消息的接收间隔为 1 小时,那么日期和时间戳将显示在最近的消息上。

我的问题是,如何对消息进行分组并获取它们,以便显示日期和时间戳以及发件人和收件人消息。

有四种类型的消息单元格类型 - 常规、组开始、组中、组结束。组启动消息比上一个消息晚一个多小时,但距下一个消息不到一个小时。 group-middle前后相隔不到一个小时。 group-end 接近它之前的那个,但是比它之后的一个多小时。常规是前后一个多小时。

这个项目有两个部分。一是正确显示每种类型的单元格。另一个是弄清楚每条消息是哪种类型。我假设您可以自己弄清楚 UI 的东西(不同的填充,对于每个填充,常规和组开始显示时间,而不是圆角等)。

对于每条消息来说,找出它的类型并不难 - 只需查看它之前和之后的消息。它可以通过结果的单个 运行 完成 - O(n)。它也可以通过缓存懒惰地完成(即每次单元加载检查它之前和之后的消息 - 将答案保存在缓存中以备下次使用)。如果不同类型的单元格大小不同,则会导致 estimatedRowHeight 出现一些奇怪的跳跃。您还可以在计算后将类型的结果存储到核心数据中。

插入消息时要小心,以使其上方和下方的消息单元格类型无效并重新计算。此外,在计算没有下一个或上一个单元格的情况下的消息单元格类型时。

我认为您希望获得一些核心数据魔法 - 比如一些带有 sectionIndexKey 的切肉刀技巧。但是 运行 遍历数组并计算它确实更直接。

更新: 只是为了说清楚:不要使用部分。将所有单元格放在一个部分中。只需将时间添加到单元格类型 group-start 的单元格顶部。这比处理节要容易得多,尤其是当存在可能导致和较早的单元格从正常更改为组开始的插入时。