2013-07-26 58 views
1

我的理解是核心數據不是線程安全的,但我對某個特定情況有疑問。假設我在主線程的上下文中創建了一個對象,但是我想要進行一些繁重的計算。所以我把對象發送到另一個線程。這聽起來很糟糕,我是否需要以某種方式複製該對象?如果我將該對象保存在另一個線程的上下文中,那麼它似乎無法從該上下文中獲取有效的對象(我必須先保存到商店嗎?這看起來像是濫用了硬盤)。我使用的神奇紀錄的時刻和流量是這樣的:關於多線程核心數據的澄清

mSaveData = [XXX MR_createEntity]; 
//Set various properties 

//In another method 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    mSaveData.questionId = xxx; 
    //Set more properties 

    [[mSaveData managedObjectContext] MR_saveToPersistentStoreAndWait]; 
} 

起初我還以爲我應該使用[mSaveData MR_inThreadContext],但該方法返回nil(也許是因爲對象尚未得救了嗎?)。我目前的方法共享線程之間的上下文(僅用於保存操作),所以它讓我有點不舒服。是否有不同的方法是首選?我應該簡單地派遣回主線程設置屬性並保存?

+0

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/Concurrency.html –

回答

2

請去閱讀文檔。您不能在線程之間共享上下文或管理對象。

您可以將對象ID傳遞給另一個線程,並從該線程的上下文中檢索關聯的對象。

  1. 將上下文保存在第一個線程中。
  2. 使用contextDidSave通知將更改合併到第二個線程的上下文中。
  3. 然後,您將能夠在第二個線程中檢索最新的對象。
+0

對,我已經知道了很多,但試圖讓對象返回'nil'。顯然,除非您在第一個上下文中調用save,否則無法將對象從另一個上下文中移出。 – borrrden