NSFetchedResultController - 对 2 个属性进行自定义排序
Posted
技术标签:
【中文标题】NSFetchedResultController - 对 2 个属性进行自定义排序【英文标题】:NSFetchedResultController - Custom Sorting on 2 Attributes 【发布时间】:2014-06-25 11:00:57 【问题描述】:我在我的项目中使用 NSFetchedResultController。以下是我想要实现的场景。
我有一个名为 Contact 的表,其中有 2 个属性 LastMessageDate 和 ContactName。 我想根据 LastMessageDate 对联系人对象进行排序。没有LastMessageDate的对象应该按照ContactName(Alphabetally)排序。例如:
考虑我有 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
的默认日期设置为distantFuture
或distantPast
?
现在,当您按日期排序时,这些项目将是第一个或最后一个,并且将使用第二个排序描述符(因此它们将按字母顺序排序)。
当它等于distantFuture
或distantPast
(可能在自定义访问器方法中)时,您的其他代码将检查日期是什么并且不使用。
【讨论】:
以上是关于NSFetchedResultController - 对 2 个属性进行自定义排序的主要内容,如果未能解决你的问题,请参考以下文章
NSFetchedResultController - 对 2 个属性进行自定义排序
如何使用 NSArraycontroller 在可可上创建 NSFetchedresultController?
NSFetchedResultController 和 UISearchBar 实现
一个用于 UITableview 和 UISearchDisplayController 的 NSFetchedResultController