0

我有一个多一对多下列实体之间关系的模型: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次。

如果我创建了第二次会议对象,然后在同一5人加入到这次会议上,willChangedidChange委托方法,仅启动两次,第一次人后一次,最后人后一次。如预期的那样调用controller:didChangeObject:...方法5次,但不按照人们插入的顺序。

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

回答

1

通知不保证以任何顺序显示,因此这不是问题。

只要和调用顺序去willChange - >controller:didChangeObject: - >didChange只要willChangedidChange之间发生的种种变化也没有问题。

很可能,您看到的是在第一次使用和随后使用之间发送的不同通知。在第一次使用时,被管理对象很可能是故障,并且完全读取它们(故障或触发故障)触发每个对象的通知。但是,一旦他们完全活跃,再次添加它们只会触发单个通知。

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

+0

谢谢 - 这几乎证实了我的想法 –

相关问题