在 iOS5 中,我有一个使用 NSPrivateQueueConcurrencyType 创建的 NSManagedObjectContext,如下所示:
self.moc = [[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType] autorelease];
moc.parentContext = rootContext;
这在主线程上执行,但是如果我正确理解了文档,那没关系,因为 MOC 有自己的队列,对吧?
现在,在某个时候,我执行了一个获取请求,如下所示:
[self.moc performBlockAndWait:^() { // (1)
NSError* err = nil;
result = [self.moc executeFetchRequest:request error:&err];
NSLog(@"%@ %@", [NSThread currentThread], [NSThread isMainThread]?@"MAIN":@"");
}];
调用 (1) 也在主线程上调用。但我希望块内的获取请求在私有 MOC 线程上执行。到目前为止正确吗?
但是,如果我检查块内的当前线程,它实际上是主线程!NSLog 打印:
<NSThread: 0x6b10780>{name = (null), num = 1} MAIN
检查线程转储证实了这一点。
fetch 不应该在主线程上执行,因为这偶尔会导致与其他一些正在运行的代码发生死锁。那么我在这里做错了什么?