2016-05-07 30 views
0

有很多CoreData處理併發性幾個方面併發CoreData與多個上下文

其中之一是使用父/子managedObjectContexts像這樣:

let mainContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType) 
let childContext = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType) 

childContext.parentContext = mainContext 

另一種方法是有兩個主和孩子上下文使用相同的persistentStoreCoordinator像這樣:

let mainContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType) 
let childContext = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType) 

childContext.persistentStoreCoordinator = mainContext.persistentStoreCoordinator 

因爲我們需要使用performBlock在childCo ntext及更高版本保存或執行提取或任何關於mainContext,這兩種方法之間會有什麼區別?

我在Florian Kugler's blog上看到前面的方法在主線程上(我嘗試過,沒有),後者是首選的方法。但是我看過的其他每個網站似乎都喜歡以前的父母/孩子背景。

爲了讓事情更加令人困惑,在RayWenderLich的CoreData手冊(參考第10章)中,他們已經使用了這兩種方法,但沒有解釋原因。

回答

0

理想情況下,有3個簡單的規則來實現單個persistentStore核心數據應用程序的併發性。

  1. 只有一個託管對象上下文(MOC)應該附加到persistentStoreCoordinator是避免MOC鎖定,CURD操作解鎖的基本規則。
  2. 每個MOC應該附加一個線程,如主線程MOC,後臺線程MOC。
  3. 您不能通過MOC(線程)將管理對象從一個MOC(線程)傳遞到另一個,在這種情況下只需傳遞ObjectID。

爲了實現這三條規則,蘋果引入了親子MOC方法。在各種帖子上有這麼多的組合,但是每個堆棧(父子MOC方法)都高度依賴於應用程序數據的可用性。

我已經實現了作爲我的主要MOC上下文使用persistentStoreCoordinator,並創建後臺線程子MOC進行數據同步, 和更多本地子MOC爲每個視圖控制器創建新的記錄屏幕。這對我很有用,並且在數據庫上插入3500條記錄進行測試。 這樣做的好處是我通過我的主MOC獲取更新的服務器同步數據。

我知道一些評論家的方法,我會阻止主線程,但你可以利用批量更新,刪除,異步獲取請求來最小化它。

+0

阻塞主線程的事情是必須在MainQueue(mainContext)上完成的I/O操作。因此,批量更新在I/O上仍然具有相同的效果。而對於異步獲取請求,由於存在一個PersistantStoreCoordinator,它將被鎖定直到它完成CRUD,這仍然會導致UI被阻止。我錯了嗎? – Mehrdadmaskull

+0

你說得對。但在數據同步我在dispatch_async()塊內調用它,它只是主要的MOC保存調用,所以想成爲一個問題。在其他地方,我沒有任何沉重的操作。因此,維持3級MOC對我來說是值得的。 – kaushal

+0

這就是爲什麼要創建新記錄,我使用臨時MOC,稍後將保存到主要MOC。三級父母孩子MOC不會阻止你的主線程,但批量更新和創建操作的速度很慢,每種方法都有散文和錐體,這取決於你的應用行爲。 – kaushal

相關問題