![](/img/trans.png)
[英]With CoreData is it OK to have multiple contexts on the same thread?
[英]Concurrency in CoreData with multiple contexts
在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
由於我們需要在childContext上使用performBlock,然后在mainContext上保存或執行fetch或其他操作,因此這兩種方法之間有什么區別?
我在弗洛里安·庫格勒(Florian Kugler)的博客上讀到,前一種方法在主線程上處理(我嘗試過但沒有嘗試),而后一種方法是首選方法。 但是我看過的所有其他站點似乎都更喜歡以前的父/子上下文。
為了使事情變得更加混亂,在RayWenderLich的CoreData書(第10章作為參考)上,他們使用了這兩種方法,而沒有解釋原因。
理想情況下,在單個persistentStore核心數據應用程序中有3條簡單的規則可以實現並發。
為了實現這三個規則,Apple引入了親子MOC方法。 各種帖子上有如此多的組合,但是每個堆棧(親子MOC方法)高度依賴於應用程序數據的可用性。
作為主要的MOC上下文,我使用了persistentStoreCoordinator來實現,並創建了后台線程子MOC以進行數據同步,並為每個View控制器創建了更多本地子MOC來創建新記錄屏幕。 這對我來說將很好地工作,並在數據庫上進行了3500條記錄插入的測試。 這樣做的好處是我可以通過主MOC獲得更新的服務器同步數據。
我對這種方法的批評很少,我會阻塞主線程,但是您可以利用批處理更新,刪除,異步提取請求將其最小化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.