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

謝謝 - 這幾乎證實了我的想法 –

相關問題