将消息分组为类似于iPhone消息应用程序

时间:2017-04-11 11:22:42

标签: ios swift core-data nsfetchedresultscontroller messages

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

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

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

1 个答案:

答案 0 :(得分:1)

有四种类型的消息单元类型 - 常规,组 - 开始,组 - 中,组 - 结尾。组启动消息在最后一个消息后超过一小时但距离下一个消息不到一小时。 group-middle距前一个小时不到一个小时。 group-end接近前面的那个,但是在它之后的一个小时。常规是在它之前和之后一个多小时。

这个项目有两个部分。一种是正确显示每种类型的细胞。另一个是计算出每个消息的类型。我假设您可以自己弄清楚UI内容(不同的填充,每个填充,常规和分组开始显示时间,而不是围绕某些角落等)。

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

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

我认为你希望获得一些核心数据魔法 - 比如使用sectionIndexKey的一些切割技巧。但是直接运行数组并计算它就更直接了。

更新: 只是说清楚:不要使用部分。将所有细胞保留在一个部分中。只需将时间添加到单元格顶部,即单元格类型group-start。它比处理部分容易得多,特别是当插入可能导致早期单元格从正常更改为组启动时。