简单的问题,我的核心数据UIManagedDocument是在主线程上创建的,我想知道的是当我调用performBlock在主线程(创建托管文档的同一个线程)上阻塞队列/运行时?
dispatch_queue_t backgroundQueue = dispatch_queue_create("DownloadQueue", NULL);
dispatch_async(backgroundQueue, ^{
// Get data from web
[document.managedObjectContext performBlock:^{
// Add data to Core Data
}];
});
答案 0 :(得分:2)
您可以阅读Apple发行说明:CoreData Release Notes for iOS5
您可以像使用限制模式一样使用上下文 在OS X v10.7和iOS 5之前。您发送上下文消息 直;由您决定是否发送来自的邮件 正确的队列。
使用基于队列的并发类型的上下文 与两个新方法结合:performBlock:和 performBlockAndWait :.您将“标准”消息分组发送给 上下文(包括初始化,例如设置持久性存储 协调器等在一个块内传递给这些方法之一。 一个例外是:如果您的代码在主线程上执行, 您可以直接在主队列样式上下文中调用方法 而不是使用基于块的API。
performBlock:和performBlockAndWait:确保块操作 在为上下文指定的队列上执行。 performBlock: 方法立即返回,上下文执行块方法 在自己的线程上。使用performBlockAndWait:方法,上下文 仍然在自己的线程上执行块方法,但方法 在块执行之前不会返回。
重要的是要理解块作为一个独特的执行 工作的主体。一旦你的街区结束,其他任何人都可以入队 另一个块,撤消更改,重置上下文等。因此块 可能非常大,通常通过调用save:。
结束
答案 1 :(得分:0)
使用UIManagedDocument
时,创建了managedObjectContext(就像它在OS X v10.7和iOS 5之前一样),使用的内容等同于默认的限制类型NSConfinementConcurrencyType
。简而言之,这种并发类型指定上下文不会用于除最初创建上下文之外的任何其他线程。
在这种情况下,UIManagedDocument
(及其上下文)是在主线程上创建的,消息performBlock:
将在主线程上执行关联的块。通过使用performBlock:
,您实际上不必知道在创建managedObjectContext的哪个线程上,消息performBlock:
将始终在上下文所在的同一线程上执行其关联的块。