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不应该在主线程上执行,因为这会偶尔导致其他运行代码发生死锁。那么我在这里做错了什么?
重新阅读我上面的答案。没有私人MOC队列 - 您从未创建过它。 NSPrivateQueueConcurrencyType标志只告诉Core Data如何使用它 - 它不会为你创建队列。你在上面的代码中做的每件事都在主队列中。 – 2012-07-30 12:50:46
我试图编辑上面的错误信息,超时了。我的更正:我的信息是iOS 4 - 对于混淆抱歉。无论如何,我认为发生的事情是,交通部正在排队工作,为方便起见,你要把你传递给你的信息传递给你。因此,既然您要求它执行该操作并等待它(performBlockAndWait),它将在其线程上执行该操作,但会阻止主线程。您可以在此消息之前和之后登录,并记下时间差异以检验此假设。 – 2012-07-30 12:57:52
感谢您的纠正。我再次在文档中查找它,在指定NSPrivateQueueConcurrencyType时明确指出“上下文创建并管理专用队列”。我怀疑你所描述的事情正在发生。无论如何,它现在工作正常。 – radnoise 2012-07-30 13:19:38