具有私有并发类型的NSManagedObjectContext在主线程上执行块

时间:2012-07-29 22:35:17

标签: ios core-data nsmanagedobjectcontext

在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

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

不应该在主线程上执行提取,因为这有时会导致与其他一些正在运行的代码发生死锁。那么我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

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

感谢所有建议。