关于多线程核心数据的澄清

时间:2013-07-26 01:19:30

标签: ios objective-c core-data

我一般都明白Core Data不是线程安全的,但我对特定情况有疑问。假设我在主线程的上下文中创建了一个对象,但后来我想做一些繁重的计算。所以我将对象发送到另一个线程。这听起来很糟糕,我需要以某种方式复制该对象吗?如果我将对象保存在另一个线程的上下文中,那么它似乎无法从该上下文中获取有效对象(我是否必须首先保存到商店?这似乎是滥用硬盘)。我现在正在使用魔法记录,流程是这样的:

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(也许是因为该对象尚未保存?)。我当前的方法在线程之间共享一个上下文(仅用于保存操作),所以这让我有点不舒服。有不同的方法是首选吗?我应该简单地发送回主线程来设置属性并保存吗?

1 个答案:

答案 0 :(得分:2)

请继续阅读文档。您不能在线程之间共享上下文或托管对象。

您可以将对象ID传递给另一个线程,并从该线程的上下文中检索关联的对象。

  1. 将上下文保存在第一个帖子中。
  2. 使用contextDidSave通知将更改合并到第二个线程中的上下文中。
  3. 然后,您将能够在第二个帖子中检索最新的对象。