0

我可以擁有多個NSOperation正在訪問的單個Private Managed Object上下文嗎?具有多個NSOperation的核心數據

我有2種兩個選擇:

  1. 有每一個的NSOperation管理對象上下文。 即,如果有100個NSoperation 100會創建上下文。

  2. 有一個上下文和多個NSOperation。

即單個上下文和100個NSOperations訪問它。

哪個可以是更好的選擇。

+0

你是什麼NSOperationQueue的maxConcurrentOperationCount任何併發問題,這樣的方式?你的NSOperations可以同時執行嗎?單個NSOperation完成的工作量(在要保存的對象數量或在幾秒鐘內完成其工作)是多少? – Sander

+0

1. maxConcurrentOperationCount目前保持默認。 2.通過單個NSOperation完成的工作量是多少: - 從核心數據中獲取單個對象,然後與基於該對象的服務器對象進行比較,然後根據該對象和文件上載或下載並寫入磁盤。 – user3519594

+0

正如您所描述的那樣,您不會在一次操作中將大量新數據保存到CoreData中。所以你可以有單一的上下文,並從中獲取任何對象。爲了避免併發問題,你可以使用performAndWait函數。 – Sander

回答

0

更正解決方案是選項1.創建一個併發計數爲1的隊列,並使用隊列進行所有寫入。這將避免任何可能導致信息丟失的寫入衝突。如果您需要訪問主線程的信息,您應該使用全局主線程上下文(在NSPersistentContainer中調用viewContext)。

如果這會變慢,那麼你應該調查你正在做的工作。一般來說,每個操作都應該很快,所以如果你發現它們不是你,你可能會做一些錯誤的事情(一個常見的問題是對每個導入的對象進行一次抓取 - 而不是一次大的抓取)。另一種解決方案是將大型任務分成幾個較小的任務(導入大量數據)。您還可以設置不同的優先級 - 給予用戶啓動的操作更高的優先級。

您不應該害怕創建上下文。他們並不昂貴。

0

根據您在評論中所說的話,您並未真正在單個操作中寫入大量數據,而只是爲對象提取了一個對象,我建議使用單個MOC

通常有多個MOC的原因是獨立於Main context和任何其他環境讀取/更新/保存大量數據。在這樣的流程中,您將能夠從不同的上下文同時保存這些對象。

但這不是你的情況,如果我理解正確。

對於單個提取只需要一個Private context,但我相信在創建許多上下文時不會有太多開銷。但爲什麼要做額外的工作?

1.So,爲您打造私人MOC

let privateContext = NSManagedObjectContext(concurrencyType:.privateQueueConcurrencyType) 

2.創建每個操作,並通過MOC

let operation = MyOperation(context: privateContext) 

3.In操作執行與功能的私人MOC同步調用。 在你應該避免使用單MOC

func performAndWait(_ block: @escaping() -> Swift.Void) 

例如

let myObject: Object? 
privateContext.performAndWait { 
    myObject = privateContext.fetch(...) 
} 
// do what you need with myObject