我有两种类型的异议:地点和历史项目。 我正在尝试获取附加到任何历史记录项的位置,因此我对该位置的获取谓词是“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?
答案 0 :(得分:4)
AFAIK,您必须仅使用collection operators中描述的Key-Value Coding Programming Guide,使用collections(NSArray
,NSSet
排序描述符的关键路径,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];
....
}