NSFetchedResultsController - 何时触发委托方法?

时间:2011-09-26 15:21:30

标签: iphone objective-c ios core-data nsfetchedresultscontroller

我有一个在以下实体之间具有多对多关系的模型:

会议> ---<人

我正在使用NSFetchedResultsController返回会议的所有人(这些会显示在自定义视图中)。 NSFetchRequest创建如下:

NSSortDescriptor * lastNameSort = [NSSortDescriptor sortDescriptorWithKey: @"lastName" ascending: YES];
NSSortDescriptor * firstNameSort = [NSSortDescriptor sortDescriptorWithKey: @"firstName" ascending: YES];

request.entity = [NSEntityDescription entityForName: @"Person" inManagedObjectContext: context];
request.predicate = [NSPredicate predicateWithFormat: @"(ANY %K == %@)", @"meetings", self];
request.sortDescriptors = [NSArray arrayWithObjects: lastNameSort, firstNameSort, nil];

为单个人调用-[Meeting addPeopleObject:]工作正常 - NSFetchedResultsController的委托方法被正确触发,我可以更新自定义视图。

我在向会议中添加多人时遇到问题。一个方法循环遍历一组人,为每个人调用-[Meeting addPeopleObject:]。我第一次这样做时,在添加每个人之后会触发NSFetchedResultsControllerDelegate个方法。因此,如果我添加5个人,controllerWillChangeContent:然后controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:则会controllerDidChangeContent:被解雇5次。

如果我创建了第二个Meeting对象,然后将相同的5个人添加到此会议中,则willChangedidChange委托方法仅触发两次,一次在第一个人之后,一次之后最后的人。 controller:didChangeObject:...方法按预期调用5次,但不按插入人的顺序调用。

这是NSFetchedResultsController的预期行为吗?是否有一些缓存导致这种情况发生(NSFetchedResultsController是使用nil缓存创建的)。有没有办法强制每次更新后触发`NSFetchedResultsControllerDelegate'方法?

1 个答案:

答案 0 :(得分:1)

不保证通知会以任何形式出现,因此不存在问题。

只要呼叫顺序为willChange - > controller:didChangeObject: - > didChange只要willChangedidChange之间发生了所有更改,就没有问题。

最有可能的是,您看到的是首次使用和后续使用之间发送的不同通知。在第一次使用时,托管对象很可能是故障并且完全读取它们(故障或触发故障)会触发每个对象的通知。但是,一旦它们完全活动,立即再次添加它们只会触发一个通知。

这可能是Core Data的幕后优化之一。只要表格正确更新,我就会担心。