NSFetchedResultsController

NSFetchedResultsController

我有一个带有字符串属性Tag的实体tagName。我去将这个Entity中的所有对象都提取为NSFetchedResultsController,但是我希望带有tagName“Main”的Tag成为第一个对象。这是我现在正在做的事情:

 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语句也未显示)。我的结果仅基于为BOOL指定的ascending值返回-该块被忽略。

但是,当我在Tag中插入新的MOC对象并调用NSFetchedResultsController update委托方法时,将应用实际的sortDescriptor,并且最终会出现NSLog(@"compare"),但仅当我对对象进行更新时!无论我尝试了什么,我都无法将其应用于初始提取。

有什么想法吗?

最佳答案

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

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

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

关于iphone - 将核心数据结果排序到NSFetchedResultsController中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10113234/

10-12 05:45