在iOS5中,我有一个NSManagedObjectContext,我使用NSPrivateQueueConcurrencyType创建,如下所示:
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
检查线程转储确认了这一点。
不应该在主线程上执行提取,因为这有时会导致与其他一些正在运行的代码发生死锁。那么我在这里做错了什么?
答案 0 :(得分:0)
好的,我还不完全确定这里的机制,即上下文专用队列上发布的内容最终会在主线程上结束。我怀疑它与performBlockAndWait有关,它同步执行块。我已经重写了所有内容,所以现在所有内容都是异步完成的,现在该块在其私有线程上执行。
感谢所有建议。