1

在 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 不应该在主线程上执行,因为这偶尔会导致与其他一些正在运行的代码发生死锁。那么我在这里做错了什么?

4

1 回答 1

0

好的,我仍然不完全确定这里的机制,即发布在上下文私有队列上的内容如何最终出现在主线程上。我怀疑它与同步执行块的 performBlockAndWait 有关。我已经重写了一些东西,所以现在一切都是异步完成的,并且块现在在其私有线程上执行。

感谢所有建议。

于 2012-07-30T12:03:01.517 回答