5

當我以編程方式更改某些現有的託管對象屬性時,我的表視圖沒有更新,我有一個問題。我希望我的NSFetchedResultsControllerDelegate在這種情況下被調用,但事實並非如此。核心數據:更新託管對象不會調用NSFetchedResultsControllerDelegate

蘋果醫生說:

NSFetchedResultsController實例使用在這個協議的方法其委託控制器的擷取結果已被更改通知由於添加,刪除,移動,或更新操作。

更詳細地說,我的管理對象是一個int屬性,名爲status,它取值爲enum。我的表格視圖僅顯示status等於upToDate(其中一個枚舉值)的對象。要做到這一點,我FetchedResultController有該狀態測試謂詞:

predicate = [NSPredicate predicateWithFormat:@"doc.status == %d", upToDate]; 

它工作正常,但是當我改變了過期的對象回狀態upToDate更新不會體現出來。我的代碼是從Apple的模板中修改的。

這裏是我的嘗試:

myObject.status = [NSNumber numberWithInt:upToDate]; 
[managedObjectContext save:nil]; 
[managedObjectContext processPendingChanges]; 
[myTableView reloadData]; 

最後,我設法把我的表視圖更新至呼叫:

[fetchedResultsController performFetch:&error]; 
[myTableView reloadData]; 

但即便如此,關我NSFetchedResultsControllerDelegate get方法這與蘋果公司的文檔相矛盾。另外,沒有平滑的動畫發生。

我預計controllerWillChangeContent:,controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:controllerDidChangeContent:被調用。

我想我錯過了一些東西,可能是很明顯的東西,但我看不到。每次有一些託管對象可能發生更改時,是否需要調用performFetch:NSFetchedResultsControllerD真的什麼時候調用它的委託?

謝謝。

+0

您是否發現此行爲的任何解決方案?我面臨類似的情況,我的委託回調從未觸發更新操作。無論如何,添加新對象或刪除現有對象都會調用委託方法。可能是什麼原因? – 2012-11-18 19:46:52

回答

0

如果FRC委託方法永遠不會被調用,而不考慮更改的類型,那麼最可能的解釋是代理沒有正確配置。它可以由以下原因引起:

  1. 的代表是簡單的沒有設置
  2. 委託類未聲明的NSFetchedResultsControllerDelegate協議。
  3. 您在不合並的情況下在另一個上下文中進行更改。

我會建議捕獲保存操作的錯誤返回以確保保存沒有任何事情發生。

無論FRC是否已保存,都應向FRC通知其上下文的任何更改。 FRC應該通知其代表。

+1

1.'aFetchedResultsController.delegate = self;'存在 2.雙重檢查。 3.我只有一個上下文,從應用程序委託傳遞。正如我寫的,它基本上是香草蘋果代碼。任何其他想法還有什麼要檢查? 當然,我從保存中捕獲錯誤。我只是簡化了我的代碼片段的這個問題。 – 2010-08-31 15:09:41

0

我剛剛發生過這種情況,只是發生在initWithFetchRequest中:managedObjectContext:sectionNameKeyPath:cacheName:其中sectionNameKeyPath非零。如果我確保sectionNameKeyPath是零,那麼我會得到像我期望的更新。

我仍在調查爲什麼會發生這種情況

相關問題