2012-07-29 41 views
1

在iOS5中,我有一个的NSManagedObjectContext我与一个NSPrivateQueueConcurrencyType创建,就像这样:的NSManagedObjectContext私人并发类型在主线程上执行块

self.moc = [[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType] autorelease]; 
moc.parentContext = rootContext; 

此执行主线程上,但如果我理解文档正确的这应该不重要,因为交通部有自己的队列,对吧?

现在,在某些时候我执行读取请求时,像这样:

[self.moc performBlockAndWait:^() { // (1) 
    NSError* err = nil; 

    result = [self.moc executeFetchRequest:request error:&err]; 

    NSLog(@"%@ %@", [NSThread currentThread], [NSThread isMainThread][email protected]"MAIN":@""); 
}]; 

的调用(1)也被称为主线程上。但我期望块内的获取请求在私有MOC线程上执行。正确到目前为止?

但是,如果我检查块内的当前线程,它实际上是主线程! NSLog打印:

<NSThread: 0x6b10780>{name = (null), num = 1} MAIN 

检查线程转储确认这一点。

fetch不应该在主线程上执行,因为这会偶尔导致其他运行代码发生死锁。那么我在这里做错了什么?

回答

0

好吧,我仍然不完全确定这里的机制,即上下文专用队列上发布的内容如何在主线程上结束。我怀疑它与performBlockAndWait有关,它会同步执行该块。我已经重写了所有内容,现在所有内容都是异步完成的,并且该块现在在其专用线程上执行。

感谢您的所有建议。

+0

重新阅读我上面的答案。没有私人MOC队列 - 您从未创建过它。 NSPrivateQueueConcurrencyType标志只告诉Core Data如何使用它 - 它不会为你创建队列。你在上面的代码中做的每件事都在主队列中。 – 2012-07-30 12:50:46

+0

我试图编辑上面的错误信息,超时了。我的更正:我的信息是iOS 4 - 对于混淆抱歉。无论如何,我认为发生的事情是,交通部正在排队工作,为方便起见,你要把你传递给你的信息传递给你。因此,既然您要求它执行该操作并等待它(performBlockAndWait),它将在其线程上执行该操作,但会阻止主线程。您可以在此消息之前和之后登录,并记下时间差异以检验此假设。 – 2012-07-30 12:57:52

+0

感谢您的纠正。我再次在文档中查找它,在指定NSPrivateQueueConcurrencyType时明确指出“上下文创建并管理专用队列”。我怀疑你所描述的事情正在发生。无论如何,它现在工作正常。 – radnoise 2012-07-30 13:19:38

相关问题