有很多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章)中,他們已經使用了這兩種方法,但沒有解釋原因。
阻塞主線程的事情是必須在MainQueue(mainContext)上完成的I/O操作。因此,批量更新在I/O上仍然具有相同的效果。而對於異步獲取請求,由於存在一個PersistantStoreCoordinator,它將被鎖定直到它完成CRUD,這仍然會導致UI被阻止。我錯了嗎? – Mehrdadmaskull
你說得對。但在數據同步我在dispatch_async()塊內調用它,它只是主要的MOC保存調用,所以想成爲一個問題。在其他地方,我沒有任何沉重的操作。因此,維持3級MOC對我來說是值得的。 – kaushal
這就是爲什麼要創建新記錄,我使用臨時MOC,稍後將保存到主要MOC。三級父母孩子MOC不會阻止你的主線程,但批量更新和創建操作的速度很慢,每種方法都有散文和錐體,這取決於你的應用行爲。 – kaushal