2011-05-29 52 views
2

不知何時NSFetchedResultsChangeUpdate更改類型controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:方法通過?當NSFetchedResultsChangeUpdate更改類型發生?

我已經創建NSFetchedResultsController非零無效sectionNameKeyPath和取回請求有sortDescriptor。添加了匹配獲取請求謂詞的少數對象。然後,我嘗試更改排序屬性和該對象之一的sectionNameKeyPath屬性。其實它工作得很好:改變對象移動tableView,但每次我收到NSFetchedResultsChangeMove更改類型!更改該物品的其他道具(不用於排序或部分)並沒有觸發controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:

我對NSFetchedResultsChangeUpdate感興趣的原因是我希望NSFetchedResultsController在已獲取對象的某些屬性在與NSFetchedResultsController.fetchRequest.predicate匹配的範圍內變化時通知我。例如,謂詞將某個實體的對象與prop == 1 OR prop == 2匹配。但我也希望被通知當這樣的匹配對象之一改變它的prop值從1到2.

只是不想創建兩個NSFetchedResultsController s,因爲我相信有一個更優雅的方式。 + NSFetchedResultsChangeUpdate改變類型是唯一一個仍然未被發現的神祕關於NSFetchedResultsController - 從來沒有抓到它。

回答

1

當我創建第二個託管對象上下文時,使用相同的持久性存儲,編輯對象的值,然後將上下文保存到持久性存儲中時,會收到此值type值。

(如果我改變,它的排序上的名字,我得到的ChangeMove值,你提到。)

- (void)controller:(NSFetchedResultsController *)controller 
    didChangeObject:(id)anObject 
     atIndexPath:(NSIndexPath *)indexPath 
    forChangeType:(NSFetchedResultsChangeType)type 
     newIndexPath:(NSIndexPath *)newIndexPath { 

… 
     case NSFetchedResultsChangeUpdate: 
      [self configureCell:[tableView cellForRowAtIndexPath:indexPath] 
         inTable:tableView 
        atIndexPath:indexPath]; 
     break; 
… 

anObject = NSManagedObject子類相關改變對象的

indexPath =相關指數

newIndexPath = nil

(我創建第二個上下文的原因是針對各種用例;一個案例:「新foo對象」,用戶創建各種擁有關係的小工具,然後命中取消,我只是垃圾的上下文,沒有撤消管理需要)

+2

當NSFetchedResultsChangeUpdate觸發實體*相關*由NSFetchedResultsController管理的實體更改?例如,假設我正在創建顯示父實體的TVC,並且基於「多對多」關係計數子實體。如果子實體的數量發生變化會發生什麼?這是我必須自己處理的事情嗎? (我猜是)。 – 2011-06-27 06:57:47

+0

來自文檔: 通過以下啓發式報告更改: 關於添加和刪除操作,僅報告添加/刪除的對象。 假設受影響對象之後的所有對象也都被移動,但不會報告這些移動。 ... – bshirley 2011-06-27 17:08:10