Objective c NSManagedObjectContext在dispatch_async内执行锁
我正在用GCD做一些后台处理,并用核心数据保存一些对象。在方法Objective c NSManagedObjectContext在dispatch_async内执行锁,objective-c,cocoa,core-data,grand-central-dispatch,nsmanagedobjectcontext,Objective C,Cocoa,Core Data,Grand Central Dispatch,Nsmanagedobjectcontext,我正在用GCD做一些后台处理,并用核心数据保存一些对象。在方法[self saveData]中,我使用并发类型NSPrivateQueueConcurrencyType创建了一个NSManagedObjectContext,以在后台线程上执行核心数据操作。我正在performBlock中运行所有核心数据操作 现在,是否需要从主线程调用[self saveData],或者我可以在我所在的后台线程中继续(以避免额外的调用dispatch\u async(dispatch\u get\u main\u
[self saveData]
中,我使用并发类型NSPrivateQueueConcurrencyType
创建了一个NSManagedObjectContext
,以在后台线程上执行核心数据操作。我正在performBlock
中运行所有核心数据操作
现在,是否需要从主线程调用[self saveData]
,或者我可以在我所在的后台线程中继续(以避免额外的调用dispatch\u async(dispatch\u get\u main\u queue(),^{});
)
像这样:
dispatch_async(dispatch_get_global_queue(0, 0), ^{
BOOL isProcessed = [self processData];
if (isProcessed) {
// Save with Core Data
[self saveData];
}
});
或者我需要做什么:
dispatch_async(dispatch_get_global_queue(0, 0), ^{
BOOL isProcessed = [self processData];
if (isProcessed) {
dispatch_async(dispatch_get_main_queue(), ^{
// Save with Core Data
[self saveData];
});
}
});
performBlock:
和performBlock和wait:
确保在为上下文指定的队列上执行块操作。因此,在哪个线程上调用performBlock:
或performBlockAndWait:
并不重要
额外的
dispatch\u async(dispatch\u get\u main\u queue(),^{})因此,如果[self saveData]
对所有操作使用performBlock:
,performBlock:
和performBlockAndWait:
确保在为上下文指定的队列上执行块操作,则不需要使用code>。因此,在哪个线程上调用performBlock:
或performBlockAndWait:
并不重要
额外的dispatch\u async(dispatch\u get\u main\u queue(),^{})因此,如果[self saveData]
对所有操作使用performBlock:
,则不需要使用code>。如果应用程序在保存完成之前退出,情况如何?Apple建议不要在后台保存:@danh:The明确提到使用嵌套的托管对象上下文在第二个线程上执行后台操作,在这种情况下,“保存”意味着更改是“提交一个存储”。“核心数据编程指南”中尚未介绍新的并发类型和嵌套上下文。我只想回答这个问题,如果这里需要“代码> DeXCHOGYASYNC/代码”。丹尼尔:(除此之外,这是一个值得考虑的好地方!)丹尼尔,我觉得这个问题对你的问题很适用,我想这就是我在我的应用程序中考虑的方法。顺便说一句,谢谢你的快速回答。Martin。@PeterWarbo:这个问题/答案是在嵌套上下文和新的并发类型出现之前写的。我认为在WWDC的某个会话中提到了使用专用队列MOC来保存数据。-所以问题是“在后台线程中保存是否容易出错”是否也适用于新的专用队列MOC-我不知道!如果应用程序在保存完成之前退出呢?Apple建议不要在后台保存:@danh:The明确提到使用嵌套的托管对象上下文在第二个线程上执行后台操作,在这种情况下,“保存”意味着更改是“提交一个存储”。“核心数据编程指南”中尚未介绍新的并发类型和嵌套上下文。我只想回答这个问题,如果这里需要“代码> DeXCHOGYASYNC/代码”。丹尼尔:(除此之外,这是一个值得考虑的好地方!)丹尼尔,我觉得这个问题对你的问题很适用,我想这就是我在我的应用程序中考虑的方法。顺便说一句,谢谢你的快速回答。Martin。@PeterWarbo:这个问题/答案是在嵌套上下文和新的并发类型出现之前写的。我认为在WWDC的某个会话中提到了使用专用队列MOC来保存数据。-所以问题是“在后台线程中保存是否容易出错”是否也适用于新的专用队列MOC-我不知道!