簡體   English   中英

CoreData中具有多個上下文的並發

[英]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條簡單的規則可以實現並發。

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

為了實現這三個規則,Apple引入了親子MOC方法。 各種帖子上有如此多的組合,但是每個堆棧(親子MOC方法)高度依賴於應用程序數據的可用性。

作為主要的MOC上下文,我使用了persistentStoreCoordinator來實現,並創建了后台線程子MOC以進行數據同步,並為每個View控制器創建了更多本地子MOC來創建新記錄屏幕。 這對我來說將很好地工作,並在數據庫上進行了3500條記錄插入的測試。 這樣做的好處是我可以通過主MOC獲得更新的服務器同步數據。

我對這種方法的批評很少,我會阻塞主線程,但是您可以利用批處理更新,刪除,異步提取請求將其最小化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM