2012-04-11 65 views
3

我有一个实体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对象为MOCNSFetchedResultsController更新委托方法被调用,实际sortDescriptor得到应用,并且NSLog(@"compare")终于出现,但只有当我进行更新的对象!无论我尝试了什么,我都无法适用于初始抓取。

有什么想法吗?

+0

Mohabitar,您是否尝试过使用标准排序描述符而不是自定义比较器?我这样说是因为存在一些奇怪的未指定的规则,关于通过对商店的提取实际上可以应用什么类型的操作。另外,我建议你将测试隔离到NSFetchRequest。结果控制器增加了噪音。 IOW,确保抓取工作。然后担心显示它。安卓 – adonoho 2012-04-12 14:37:30

+0

雅一切正常的排序描述符正常工作。提取正在执行。我的结果甚至是按照上面这个排序描述符的字母顺序提取的,所以一切正常。我在没有NSFetchedResultsController的正常获取请求上试过这个确切的排序描述符,它工作得很好。它只是NSFetchedResultsController给我的问题。 – Snowman 2012-04-12 15:17:48

回答

1

正如你可能已经看到过的那样,如果你传入你的NSFetchRequest的谓词是块谓词,那么你的获取请求将失败。发生这种情况是因为CoreData需要将您的谓词转换为SQL,以便它可以针对数据库运行它。结果是,谓词永远不会与获取请求产生的对象进行实际比较。

排序描述符也是如此。执行提取时,提取请求不会执行与对象的比较。它作为SQL的一部分传递。

你也描述了一个我上面描述的规则的一个有趣的例外。当你有一个现有的NSFetchedResultsController并添加一个对象到NSManagedObjectContext时,NSFetchedResultsController通过针对该对象评估NSPredicate和NSSortDescriptor来更新,而不是将它们转换为SQL。

相关问题