对支持 CoreData 的 NSArrayController 进行排序时遇到问题
Posted
技术标签:
【中文标题】对支持 CoreData 的 NSArrayController 进行排序时遇到问题【英文标题】:Having Trouble Sorting CoreData backed NSArrayController 【发布时间】:2014-07-06 21:21:33 【问题描述】:我试图从我的 Core Data 支持的 NSArrayController 中检索排序对象数组。一旦 ManagedObjectContext 准备就绪,我会触发一个通知,拥有 NSArrayController 的对象会监听该通知,然后使用 sortDescriptors 设置获取请求。但是,数据永远不会排序。我已经为此苦苦思考了好几个小时了。
我得到了数组中的预期数据,但它根本没有排序。有人知道我哪里出错了吗?
// Elsewhere in code
...
_charts = [[NSArrayController alloc] init];
_charts.entityName = @"Charts";
...
// When Cored Data and Managed Object Context is ready
-(void)mangagedObjectContextReady
NSManagedObjectContext *moc = ((AppDelegate *)[NSApp delegate]).managedObjectContext;
_charts.managedObjectContext = moc;
_charts.usesLazyFetching = NO;
_charts.automaticallyPreparesContent = YES;
_charts.automaticallyRearrangesObjects = YES;
// Create fetch request for data
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
fetchRequest.entity = [NSEntityDescription entityForName:@"Charts" inManagedObjectContext:moc];
// Create the sort descriptors for the Charts entity
// Name and chartType are properties on the entity "Charts"
NSSortDescriptor *nameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];
NSSortDescriptor *chartTypeDescriptor = [[NSSortDescriptor alloc] initWithKey:@"chartType" ascending:YES selector:@selector(caseInsensitiveCompare:)];
fetchRequest.sortDescriptors = @[nameDescriptor, chartTypeDescriptor];
NSError *error = nil;
BOOL success = [_charts fetchWithRequest:fetchRequest merge:NO error:&error];
if(!success)
NSLog(@"Error %@:", [error localizedDescription]);
else
[_charts rearrangeObjects];
[_tv reloadData];
我使用这个方法来获取一个数组或排序的对象..但是数据没有按照上面的排序描述符排序?
[_charts.arrangedObjects objectAtIndex:row]
【问题讨论】:
【参考方案1】:_charts.sortDescriptors = @[nameDescriptor, chartTypeDescriptor];
【讨论】:
哇,这几乎是显而易见的。我认为将排序描述符放在获取请求上应该在将数据插入到 Arraycontroller 时对数据进行排序。至少所有文档都是这么说的? 您确实会从 fetch 中获得排序结果。重排数组控制器大概有自己的排序思路吧。 我没有。我注释掉在 ArrayController 上设置 sortDescriptors 以及所有这些标志 re autoPrepareContent、autoRearrange 和对 [_charts rerangedObjects] 的调用,并使用 [_charts mappedObjects] 并且数据未排序。似乎只是忽略了 fetchRequest 上的 sortDescriptors?可能是时候提交错误报告了。 [managedObjectContext executeFetchRequest:request error:&error] 应该给出排序结果。 [arrayController fetchWithRequest:fetchRequest merge:NO error:&error] 可能会替换它自己的排序顺序以上是关于对支持 CoreData 的 NSArrayController 进行排序时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章
尽管匹配 x-coredata id,但“CoreData 不支持持久的跨存储关系”