NSFetchedResultsController自定义排序没有被调用

我目前正在尝试使用NSFetchedResultsController从Core Data填充项目中的UITableView。 我正在使用比较器进行自定义搜索(尽管我也尝试了一个选择器并且有相同的问题):

    if (fetchedResultsController != nil) {
        return fetchedResultsController;
    }

    /*
     Set up the fetched results controller.
    */
    // Create the fetch request for the entity.
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    // Edit the entity name as appropriate.
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Object" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    // Set the batch size to a suitable number.
    [fetchRequest setFetchBatchSize:20];
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"objectName" ascending:YES comparator:^(id s1, id s2) {
            NSLog(@"Comparator");
      //custom compare here with print statement
    }];
    NSLog(@"Sort Descriptor Set");
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Object" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];
    [fetchRequest setSortDescriptors:sortDescriptors];

    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"firstLetterOfObject" cacheName:@"Objects"];
    [aFetchedResultsController release];
    [fetchRequest release];
    [sortDescriptor release];
    [sortDescriptors release];
    if (![fetchedResultsController performFetch:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    return fetchedResultsController;

当我输入这个标签时,我已经记录了整个程序,发现NSFetchedResultsController在读取时甚至不会输入比较器块。 而是用一些默认排序方法对其进行排序。

但是,如果我使用objectName删除并添加Object,则它将进入比较器块并正确排序表。

为什么NSFetchedResultsController在托管对象模型改变之前不能使用比较器进行排序?

注意:我已经试过关闭缓存,并且/或者在viewDidLoad中执行一次提取操作,但是似乎我提取多少次并不重要,但是什么时候执行。 出于某种原因,它只在对象模型更改后使用我的排序。


有几件事我能想到。 首先,虽然这可能不是你的问题,但你不能排序瞬态属性。 但更有可能的是,当在由SQL存储支持的模型中进行排序时,比较器会“编译”为SQL查询,并非所有Objective-C函数都可用。 在这种情况下,执行提取后您需要在内存中进行排序。

编辑:请参阅此文档,特别是提取谓词和排序描述符部分。


我看到同样的问题,并且解决它的一种方法是修改对象,保存更改并将其恢复到原始值并再次保存。

    // try to force an update for correct initial sorting bug
NSInteger count = [self.fetchedResultsController.sections count];
if (count > 0) {
    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:0];
    count = [sectionInfo numberOfObjects];
    if (count > 0) {
        NSManagedObject *obj = [self.fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
        NSString *name = [obj valueForKey:@"name"];
        [obj setValue:@"X" forKey:@"name"];
        // Save the context.
        [self saveContext];
        [obj setValue:name forKey:@"name"];
        // Save the context.
        [self saveContext];
    }
}

对不起,您是否错过了您的代码片段的最终获取部分?

NSError *error;
BOOL success = [aFetchedResultsController performFetch:&error];

不要忘记发布请求:

[fetchRequest release];
链接地址: http://www.djcxy.com/p/36173.html

上一篇: NSFetchedResultsController custom sort not getting called

下一篇: Using an NSFetchedResultsController without a UITableViewController