NSSortDescriptor和多对多关系

时间:2009-10-05 14:44:32

标签: iphone cocoa-touch core-data

我有两种类型的异议:地点和历史项目。 我正在尝试获取附加到任何历史记录项的位置,因此我对该位置的获取谓词是“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'

Halp plox?

4 个答案:

答案 0 :(得分:4)

AFAIK,您必须仅使用collection operators中描述的Key-Value Coding Programming Guide,使用collectionsNSArrayNSSet排序描述符的关键路径,NSDictionary)。

您不能将收集运算符用于具有提取请求(NSFetchRequest)的排序描述符的关键路径。

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

如果集合运算符用于指定用于对提取请求进行排序的关键路径,那就很好了。请在http://bugreport.apple.com/提交此功能请求。它报告的越多,他们就越有可能支持它。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

从iOS 13(和朋友)开始,您应该能够使用派生表达式historyMaxTime创建名为max:(history.time)的{​​{3}},然后设置fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"historyMaxTime" ascending:NO]]

答案 3 :(得分:0)

以下是我所做的类似代码

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];

    ....
}