我有一个实体Tag
与字符串属性tagName
。我去取这个实体中的所有对象为NSFetchedResultsController
,但我想用tagName
“Main”作为第一个对象。下面是我现在在做什么:核心数据结果分类到NSFetchedResultsController
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"Tag" inManagedObjectContext:appDelegate.managedObjectContext];
[fetchRequest setEntity:entity];
NSSortDescriptor *lastDescriptor2 =
[[[NSSortDescriptor alloc] initWithKey:@"tagName" ascending:NO comparator:^NSComparisonResult(NSString* tag1, NSString* tag2) {
NSLog(@"compare");
if ([tag1 isEqualToString:@"main"]) return NSOrderedAscending;
if ([tag2 isEqualToString:@"main"]) return NSOrderedDescending;
return [tag1 compare:tag2];
}] autorelease];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:lastDescriptor2]];
NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:appDelegate.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
self.fetchedResultsController = theFetchedResultsController;
self.fetchedResultsController.delegate=self;
if (![[self fetchedResultsController] performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
该代码被称为在我viewDidLoad
方法,并且只调用一次。第一次被调用时,出于某种原因,sortDescriptor在这里不适用 - 它只是不被调用(NSLog
语句也没有出现)。我的结果仅基于我为ascending
指定的值BOOL
返回 - 该块将被忽略。
但是,当我插入一个新的Tag
对象为MOC
和NSFetchedResultsController
更新委托方法被调用,实际sortDescriptor得到应用,并且NSLog(@"compare")
终于出现,但只有当我进行更新的对象!无论我尝试了什么,我都无法适用于初始抓取。
有什么想法吗?
Mohabitar,您是否尝试过使用标准排序描述符而不是自定义比较器?我这样说是因为存在一些奇怪的未指定的规则,关于通过对商店的提取实际上可以应用什么类型的操作。另外,我建议你将测试隔离到NSFetchRequest。结果控制器增加了噪音。 IOW,确保抓取工作。然后担心显示它。安卓 – adonoho 2012-04-12 14:37:30
雅一切正常的排序描述符正常工作。提取正在执行。我的结果甚至是按照上面这个排序描述符的字母顺序提取的,所以一切正常。我在没有NSFetchedResultsController的正常获取请求上试过这个确切的排序描述符,它工作得很好。它只是NSFetchedResultsController给我的问题。 – Snowman 2012-04-12 15:17:48