核心数据 - 如果我提供NSPredicate和委托,NSFetchedResultsController是否会自动跟踪更改

时间:2011-04-19 09:49:39

标签: iphone core-data nsfetchedresultscontroller nspredicate

我对NSFetchedResultController更新问题有疑问。

您可能已经知道,如果我获取所有项目并设置NSFetchedResultController的委托,那么如果数据已更改,控制器将捕获更改并自动更新其对象。

但是如果我使用NSPredicate获取项目,它不会捕获任何更改或其对象。有人可以告诉我为什么吗?

以下是使用NSPredicate设置的代码。

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:self.globalContext];
    [fetchRequest setEntity:entity];
    [fetchRequest setFetchBatchSize:200]; 

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Department" ascending:YES selector:nil];

    NSArray *descriptors = [NSArray arrayWithObjects:sortDescriptor, nil];
    [fetchRequest setSortDescriptors:descriptors];
    [sortDescriptor release];

    NSPredicate *pred = [NSPredicate predicateWithFormat:@"Department IN %@",departmentArray];
    [fetchRequest setPredicate:pred];

    self.resultsController = [[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.globalContext sectionNameKeyPath:@"Department" cacheName:@"Root"] autorelease];
    self.resultsController.delegate = self;

    [self.resultsController performFetch:nil];
    [fetchRequest release];

在代码中,我将@“Department”设置为sectionNameKeyPath,我只需要来自多个Department(departmentArray)的“Person”项,而不是所有Departments。

如果我从NSFetchRequest中删除NSPredicate,那么每次插入一个甚至包含新部门的人物项时,resultsController都会知道并触发该委托。

但是如果我保留NSPredicate,resultsController将无法知道任何更改。例如:

我的部门阵列有以下名称:@“Sales”,@“Human Resources”。

最初,核心数据中没有来自@“Sales”的人员。我取了一个,然后只获得了来自@“人力资源”的人。

然后插入一个来自@“Sales”的人,我认为resultsController应该自动更新,对吗?因为@“Sales”的新人适合NSPredicate,对吧?

由于

1 个答案:

答案 0 :(得分:1)

谓词不是动态的,并且在创建谓词后不响应departmentArray中的更改。就谓词而言,departmentArray仅包含Human Resources。此外,获取请求同样是静态的并且不会改变,因此即使谓词确实改变,提取请求也不会改变。

如果更改departmentArray,则需要为获取的结果控制器生成新的提取请求。