Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSManagedObjectContext在dispatch_async内执行锁_Objective C_Cocoa_Core Data_Grand Central Dispatch_Nsmanagedobjectcontext - Fatal编程技术网

Objective c NSManagedObjectContext在dispatch_async内执行锁

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

我正在用GCD做一些后台处理,并用核心数据保存一些对象。在方法
[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-我不知道!