【问题标题】:NSFetchedResultController - Custom Sorting on 2 AttributesNSFetchedResultController - 对 2 个属性进行自定义排序
【发布时间】: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(按字母顺序)排序)

标签: ios iphone objective-c core-data nsfetchedresultscontroller


【解决方案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(可能在自定义访问器方法中)时,您的其他代码将检查日期是什么并且不使用。

【讨论】:

    猜你喜欢
    • 2020-07-20
    • 1970-01-01
    • 2011-02-16
    相关资源
    最近更新 更多