2013-07-26 55 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