Iphone NSSortDescriptor和多个关系

Iphone NSSortDescriptor和多个关系,iphone,cocoa-touch,core-data,Iphone,Cocoa Touch,Core Data,我有两种反对意见:地点和历史项目。 我正在尝试获取附加到任何历史记录项的位置,因此该位置的获取谓词为“history@count>0”,这很好 我还想使用NSSortDescriptor按最新历史记录项的日期对位置对象进行排序,据我所知,这将是“history@max.time”,但这会引发以下错误: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Keypath c

我有两种反对意见:地点和历史项目。 我正在尝试获取附加到任何历史记录项的位置,因此该位置的获取谓词为“history@count>0”,这很好

我还想使用NSSortDescriptor按最新历史记录项的日期对位置对象进行排序,据我所知,这将是“history@max.time”,但这会引发以下错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Keypath containing KVC aggregate where there shouldn't be one; failed to handle history.@max.time' ***由于未捕获异常“NSInvalidArgumentException”而终止应用程序, 原因:“包含KVC聚合的密钥路径,其中不应该有一个; 无法处理历史记录。@max.time'
Halp plox?

可能不是最好的解决方案,但您可以随时收回数据并在事后对其进行排序。看一看。

这里有一些代码,我也有类似的代码

NSError *error;

if (![[self fetchedResultsController] performFetch:&error])
{
    UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Error" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] autorelease];
    [alert show];
}
else
{
    self.feedsArray = [fetchedResultsController fetchedObjects];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"articles.@max.postDate" ascending:NO];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

    self.feedsArray = [feedsArray sortedArrayUsingDescriptors:sortDescriptors];

    [sortDescriptors release];
    [sortDescriptor release];

    NSInteger overviewAmount = [[feedsArray valueForKeyPath:@"@sum.unreadArticles"] integerValue];

    ....
}
这样,您只能将中描述的用于排序描述符的键路径(
NSArray
NSSet
NSDictionary

对于排序描述符的键路径,您不能在提取请求中使用集合运算符(
NSFetchRequest

@kdbdallas正确地使用收集运算符对
NSArray
进行排序。他没有使用它来指定提取请求的排序描述符


不过,如果集合操作符能够指定对获取请求进行排序所依据的关键路径,那就太好了。请在提交此功能请求。报告越多,他们就越有可能支持它。

由于iOS 13(和朋友们),您应该能够使用派生表达式
max:(history.time)
创建一个名为
historyMaxTime
,然后设置
fetchRequest.sortDescriptors=@[[NSSortDescriptor sortDescriptor WithKey:@“historyMaxTime”升序:否]]

是否为
位置。历史记录
数组/集合?(似乎是一个,但你有一个单数形式。)这是一个多对多的关系,这意味着它是。单数形式是我的错,但我现在不想弄乱它,以免弄坏任何东西。乔纳斯,你明白了吗?我处于完全相同的情况下,并且得到了同样的错误。谢谢,恐怕我没有,因为我有更紧迫的问题要处理,所以目前列表仍然按照核心数据想要表示的方式排序。不过,如果能找到一个解决方案,那就太好了。我完全忘了留下上面的评论,从那以后,我“不知何故”设法得到了@“articles@max.postDate”,正在工作。我跑回这篇文章,寻找类似问题的答案。在另一段代码中,我尝试使用:@“@max.unreadArticles”,并得到错误:实体搜索与键“@max”的键值编码不兼容。我将在下面的回答中发布我所看到的可能是修复的“可能”的东西。知道是什么修复了它吗?在代码中看不到任何可能被修复的东西…我不确定到底是什么。。。您是否对您的实体进行了分壳?我的两个都是(所以在上面的例子中,我正在对实体进行获取,而articles实体是子类的)我在子类中没有任何关于articles的特殊内容,所以我真的不记得我为什么要将其子类化,所以也许这就是为什么。。。另一个想法是在我的文章实体中的属性postDate,我在模态中设置了@max来编制索引。也许你可以试试。还要确保日期值具有默认值。我使用:1980-01-01 00:00:01我向苹果提交了此问题:ID:9758650,标题:收集操作员应使用核心数据,产品:iPhone SDK,分类:增强,发起日期:2011年7月12日12:26上午,状态:OpenI已提交rdar://10468062 以相同的头衔和部门及员工为例。建议的人越多越好!在开放式雷达上找不到错误报告10468062。这真的很有帮助,所以我可以更容易地欺骗它。