NSFetchedResultController - 对 2 个属性进行自定义排序

Posted

技术标签:

【中文标题】NSFetchedResultController - 对 2 个属性进行自定义排序【英文标题】:NSFetchedResultController - Custom Sorting on 2 Attributes 【发布时间】:2014-06-25 11:00:57 【问题描述】:

我在我的项目中使用 NSFetchedResultController。以下是我想要实现的场景。

我有一个名为 Contact 的表,其中有 2 个属性 LastMessageDateContactName。 我想根据 LastMessageDate 对联系人对象进行排序。没有LastMessageDate的对象应该按照ContactNameAlphabetally)排序。

例如:

考虑我有 C1、C2、C3、C4、C5、C6 作为我的联系人,其中 C2 和 C6 存在 LastMessageDate。所以排序后的联系人应该是C2,C6,C1,C3,C4,C5

【问题讨论】:

你尝试了什么?它做了什么? 尝试了多个 SortDescriptor。但是由于我输入的条件,联系人的顺序不正确(即没有 LastMessageDate 的对象应根据 ContactName(按字母顺序)排序) 【参考方案1】:

使用两个排序描述符首先将按字母顺序对所有联系人进行排序,第二个将根据最后消息日期进行过滤。请参阅以下代码 -

NSSortDescriptor *contactName = [[NSSortDescriptor alloc]
                                    initWithKey: @"ContactName" ascending: YES];

NSSortDescriptor *lastMessageDate = [[NSSortDescriptor alloc]
                                                    initWithKey: @"LastMessageDate" ascending: YES];


NSArray *sortedArray = [contactArray sortedArrayUsingDescriptors: [NSArray arrayWithObjects: contactName, lastMessageDate, nil]];

【讨论】:

我在 ContactName Sorting 中添加了本地化CaseInsensitiveCompare: 方法。【参考方案2】:

您能否将LastMessageDate 的默认日期设置为distantFuturedistantPast

现在,当您按日期排序时,这些项目将是第一个或最后一个,并且将使用第二个排序描述符(因此它们将按字母顺序排序)。

当它等于distantFuturedistantPast(可能在自定义访问器方法中)时,您的其他代码将检查日期是什么并且不使用。

【讨论】:

以上是关于NSFetchedResultController - 对 2 个属性进行自定义排序的主要内容,如果未能解决你的问题,请参考以下文章

NSFetchedResultController - 对 2 个属性进行自定义排序

如何使用 NSArraycontroller 在可可上创建 NSFetchedresultController?

NSFetchedResultController 和 UISearchBar 实现

一个用于 UITableview 和 UISearchDisplayController 的 NSFetchedResultController

使用 NSFetchedresultController 对“瞬态”字段进行排序

核心数据 - NSFetchedResultController 按其他表字段排序数据