使用GCD时核心数据实体出错

时间:2014-04-11 18:16:59

标签: ios multithreading core-data grand-central-dispatch nsmanagedobjectcontext

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

            for (NSDictionary* info in houses) {
                House* house = [DataManager processJSON:info]; //this method processes JSON into Core Data objects and saves them
                [self.data addObject:house];
            }

            dispatch_async(dispatch_get_main_queue(), ^{
                //update the UI based on the new House objects added to the data array

            });

        });

My House对象有时会起作用,但通常会以不可预测的方式结束:

<House: 0x17f8b420> (entity: House; id: 0x17f71e90 <x-coredata://2826DE3A-1762-4958-8402-541D2B1754FA/House/p219> ; data: <fault>)

我认为这与在后台线程上处理Core Data对象有关,导致某种上下文冲突。但我找不到使用Core Data with GCD的许多具体例子。关于我可以在这里添加什么以确保对象不是故障的任何建议?

1 个答案:

答案 0 :(得分:0)

通常,在调度访问特定托管对象上下文和可能的托管对象的Core Data方法时,不应使用某些任意队列。

特定的托管对象上下文与

相关联
  • 专用线程(NSConfinementConcurrencyType
  • 私人调度队列NSPrivateQueueConcurrencyType
  • 主线程(NSMainQueueConcurrencyType)。

如果使用NSConfinementConcurrencyType并发策略创建托管对象上下文,则需要记住创建上下文的线程,并使用此线程将消息发送到上下文,并将消息发送到托管对象。在此背景下注册。

如果使用NSMainQueueConcurrencyType并发策略创建了上下文,则需要确保发送到上下文的消息和为此上下文注册的托管对象将在主线程上执行。

如果使用NSPrivateQueueConcurrencyType创建了上下文,则需要确保发送到上下文并发送到使用此上下文注册的托管对象的消息将通过使用托管对象上下文的方法{在此私有调度队列上执行} { {1}}或performBlock:

这对基本上所有方法都有效 - 特别是访问托管对象的属性。只有少数例外,其中一个方法可以在任何地方执行,而不管并发策略如何,例如[NSManagedObject] preformBlockAndWait: