2013-04-09 25 views
0

這是一個非常具體的問題,我剛纔已經被它咬了,所以爲了節省時間和痛苦,這裏是我的問題和解決方案。核心數據在更新NSFetchedResultsControllers之前是否實際保存了對磁盤的任何更改?

例如,當您保存主要上下文時,它會觸發NSFetchedResultsController委託回調,您是否可以依靠事實保存已經真正完成,並且可以安全地在這些回調中執行新的提取請求,前提是當前已保存數據將包括在內?

答案是否定的。

回答

4

如果您的應用程序中有活動的NSFetchedResultsController(NSFRC),它有一個委託集並監視相關對象的更改,那麼這裏有一個小的無證的警告,所有Core Data開發人員都應該知道。如果您在主環境中執行保存並讓NSFRC處理主環境,則在實際保存之前,在主環境上調用​​將首先更新NSFRC並調用willChangeContent:..didChangeContent:..等您的NSFRC委託的回調MOC內容到磁盤。

,爲什麼這可能是有問題的原因是,如果你試圖執行使用NSDictionaryResultType那些NSFRC回調內與resultType,那麼你的讀取請求將不包括任何電流變化的新的提取請求。通過目前的變化,我的意思是你首先調用NSFRC回調的那些變化。

您看不到這些更改的原因是因爲將resultType設置爲NSDictionaryResultType會關閉includesPendingChanges屬性。因此,獲取請求僅直接從磁盤獲取更改,並且不會合並來自上下文的任何本地更改。

我可以理解爲什麼使用字典結果類型的任意提取請求不合並來自上下文的未保存結果的原因,因爲字典可以具有任意結構,而MOC正在建模圖中的對象和關係,但是,對我來說有趣和令人驚訝的部分是NSFRC委託人在實際完成保存之前得到了更新回調。

這裏的一些ASCII藝術:

 
    1. save Main MOC --> | 2. NSFRC callbacks --> | 3. actual save happens here 
         |   |    |    
         |   |    | 
         |   ▼    | 
         | NSDictionaryResultType | 
         | fetch requests won't | 
         | see any changes from | 
         | this current save, but | 
         | regular fetch requests | 
         | will see those changes | 

PS:核心數據是有限的性能的設備中運行的對象的圖形化管理框架。有時你需要優化。

+0

用於ASCII藝術的+1。核心數據*是一個「無證的告誡」,但我們現在不進入。 – matt 2013-04-09 05:17:14

+1

@matt:▼= U + 25BC不是ASCII :-) +1雖然有趣的信息。 – 2013-04-09 07:08:59

+0

@MartinR - 我希望能夠在裏面潛行,但很好。德勤! – Anurag 2013-04-09 19:10:20

相關問題