2016-01-08 127 views
0

我想得到一些建議,使我的項目中的核心數據操作併發。我的項目自兩年以來一直運行,因此它有許多實現可以根據objectiveC中新功能的可用性進行優化。主要是,我正在尋找優化CoreData操作。核心數據併發性

目前大部分的數據操作都是使用主管理對象上下文完成的。最近,我實現了一項新功能,可以在登錄後使用核心數據下載大量數據並插入數據庫。這應該與應用程序中的其他操作並行執行。現在我意識到爲核心數據編寫的代碼正在主線程中執行,因爲應用程序的UI在coredata操作期間被阻塞。因此,我提到了許多博客,並且知道有兩種策略可以實現核心數據併發性,即藉助多個上下文和父/子託管對象上下文進行通知。

我試過父母/孩子的策略,因爲蘋果不喜歡其他策略。但我在executeFetchRequest上遇到了隨機崩潰,例外情況是「Collection在枚舉時發生了變化」。在實施父/子策略之後,這種異常開始發生。任何人都可以幫我解決這個問題嗎?

回答

0

是的,我知道有沒有描述高效利用核心數據的項目,但幸運的是,我發現一個如此衆多的博客......這正確指向您的問題...看看這裏 - >https://medium.com/soundwave-stories/core-data-cffe22efe716#.3wcpw1ijo

也您的例外發生,因爲你正在更新你的數據庫,同時正在某處用它來消除這種異常,你可以做到這一點,如:

如果您在數組或字典中獲取數據,然後做的更改語句這樣

NSDictionary *myDict = [[coreDataDectionary] mutableCopy]; 

現在對您從數據庫中獲取的數組或字典執行任何操作,但不會顯示任何異常。 希望這可以幫助你。

0

您應該在您的代碼中使用completionBlock。 here是教程和解釋。 即使您的下載沒有完成,它也將允許您不凍結您的UI應用程序。即使代碼塊中的代碼尚未完成,代碼的執行也會繼續。下載結束後,塊內會有回調動作。

0

試試這個:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^{ 
    // DATA PROCESSING 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     // UPDATE UI 
    }); 
} 
0

使用此核心數據堆棧導入大型數據集時,儘量減少UI鎖:

有自己的PSC
  1. 一個主線程MOC。
  2. 一個具有自己的PSC的背景MOC。
  3. 將背景MOC的保存通知合併到主線程MOC中。

是的,你可以 - 也應該 - 使用兩個獨立的PSC(NSPersistentStoreCoordinator)指向相同的.sqlite文件。它會將整體鎖定時間縮短到僅鎖定SQLite,避免PSC級別的鎖定,因此整體UI鎖定時間將爲[SQLite寫入鎖定] + [主線程MOC讀取]。

您可以在後臺線程中使用後臺MOC,或者在NSOperation以內更好 - 我發現處理數據並在同一線程上將其提供給Core Data非常方便。

分批進口。憑經驗選擇批量大小。每次保存後重置背景MOC。

當處理非常大的數據集時,數十萬個對象在每次保存時都不要使用refreshObject:mergeChanges:和主線程MOC。速度很慢,最終會消耗所有可用內存。請重新加載您的FRC。

而關於「集合被枚舉時變異」。核心數據中的多對多關係是可變集合,因此您必須在迭代之前進行復制或更好地將它們排序爲NSArray