我对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,对吧?
由于
答案 0 :(得分:1)
谓词不是动态的,并且在创建谓词后不响应departmentArray
中的更改。就谓词而言,departmentArray
仅包含Human Resources
。此外,获取请求同样是静态的并且不会改变,因此即使谓词确实改变,提取请求也不会改变。
如果更改departmentArray
,则需要为获取的结果控制器生成新的提取请求。