NSFetchedResultsController 对日期 (dd/mm/yyyy) 部分中的聊天项目进行排序,并且每个部分再次按 dd/mm/yy hh:mm:ss 排序

Posted

技术标签:

【中文标题】NSFetchedResultsController 对日期 (dd/mm/yyyy) 部分中的聊天项目进行排序,并且每个部分再次按 dd/mm/yy hh:mm:ss 排序【英文标题】:NSFetchResultController to sort chat items in date (dd/mm/yyyy) sections and each section again sorted by dd/mm/yy hh:mm:ss 【发布时间】:2015-11-18 11:48:04 【问题描述】:

我正在创建一个聊天应用程序 UI,比如我需要对聊天消息进行排序并根据 NSDate (DD/MM/YY) 对它们进行分类的应用程序。

每个不同的 (DD/MM/YY) 部分名称都将根据包含该日期的时间戳再次对项目进行排序。

如何在 NSFetchResultsController 中实现这一点。我成功地使用 Distinct Query 来获取与 DD/MM/YYYY 匹配的所有聊天对象日期并找到部分名称。

然后再次查询数据库以查找与日期部分的聊天对象时间戳匹配的所有聊天,但每个聊天的时间不同。

但这会在核心数据上消耗大量的 UI / 后端操作。是否有任何最佳方法来实现这一点。

示例:

数据库中的聊天对象 聊天 ID |留言正文 |时间戳 |发件人 ID |接收者 ID

数据示例 聊天-001 |这是测试 1 消息 | 22/10/2015:12:00:20 | abc.dev.abc.com | def.dev.abc.com 聊天-002 |这是测试 2 消息 | 22/10/2015:13:00:20 | abc.dev.abc.com | def.dev.abc.com 聊天-003 |这是测试 3 消息 | 22/10/2015:13:10:20 | def.dev.abc.com | abc.dev.abc.com 聊天-004 |这是测试 4 消息 | 22/10/2015:14:10:20 | def.dev.abc.com | abc.dev.abc.com 聊天-005 |这是测试 5 消息 | 23/10/2015:13:00:20 | abc.dev.abc.com | def.dev.abc.com 聊天-006 |这是测试 6 消息 | 23/10/2015:13:05:20 | abc.dev.abc.com | def.dev.abc.com 聊天-007 |这是测试 7 消息 | 24/10/2015:13:10:20 | def.dev.abc.com | abc.dev.abc.com 聊天-008 |这是测试 8 消息 | 24/10/2015:13:10:20 | def.dev.abc.com | abc.dev.abc.com

预期输出

部分名称:22/10/2015 CHAT-001 |这是测试 1 消息 | 22/10/2015:12:00:20 | abc.dev.abc.com | def.dev.abc.com CHAT-002 | 这是测试 2 消息 | 22/10/2015:13:00:20 | abc.dev.abc.com | def.dev.abc.com CHAT-003 |这是测试 3 消息 | 22/10/2015:13:10:20 | def.dev.abc.com | abc.dev.abc.com CHAT-004 | 这是测试 4 消息 | 22/10/2015:14:10:20 | def.dev.abc.com | abc.dev.abc.com

部分名称:23/10/2015 聊天-005 |这是测试 5 消息 | 23/10/2015:13:00:20 | abc.dev.abc.com | def.dev.abc.com 聊天-006 |这是测试 6 消息 | 23/10/2015:13:05:20 | abc.dev.abc.com | def.dev.abc.com

部分名称:24/10/2015 聊天-007 |这是测试 7 消息 | 24/10/2015:13:10:20 | def.dev.abc.com | abc.dev.abc.com 聊天-008 |这是测试 8 消息 | 24/10/2015:13:10:20 | def.dev.abc.com | abc.dev.abc.com

非常感谢任何快速帮助,以便我可以使用 NSFetchResultsController 并使用 performFetchLimit 和批量大小实现加载更多选项。

【问题讨论】:

如果您正在使用(或乐于翻译)Objective-C,这个Apple example 提供了一个关于如何去做的好主意。 感谢 PBASDF,但我仍然无法理解这一点。有什么方法可以通过一个示例 sn-p 来满足上述要求。理解起来真的很有帮助。现在我尝试的是创建另一列并填充与时间戳列相同但没有时间的值。然后将此列作为sectionkeypathname 传递给获取结果控制器到部分,然后使用时间戳列作为排序描述符。但这是最佳解决方案吗? 如果您的新列是暂时的,那么您的解决方案(本质上)就是我引用的 Apple 示例中使用的方法。如果您使用的是新的持久属性,那么您的解决方案会略有不同,并且如果/每当时间戳更改时,设置新属性的开销(可能可以忽略不计)都会带来。但它在其他方面是相同的解决方案。它工作正常吗?如果没有,请发布您到目前为止的内容... 我修复了这个问题,并使用瞬态属性像魅力一样工作,对 Coredata 瞬态使用做了一些学习......非常感谢这个建议。 【参考方案1】:

我修复了这个问题并使用瞬态属性像魅力一样工作,对 Coredata 瞬态使用做了一些学习......非常感谢这个建议。

【讨论】:

以上是关于NSFetchedResultsController 对日期 (dd/mm/yyyy) 部分中的聊天项目进行排序,并且每个部分再次按 dd/mm/yy hh:mm:ss 排序的主要内容,如果未能解决你的问题,请参考以下文章

在 Core Data 应用程序中调用 performFetch 后,是不是需要手动更新表视图?