从performBlock调用的方法中的FetchRequest NSPrivateQueueConcurrencyType失败

时间:2013-01-22 14:53:07

标签: ios objective-c ios6 grand-central-dispatch nsmanagedobjectcontext

performBlock内,我将managedObjectContext移交给其他使用它进行核心数据访问的方法。 managedObjectContextNSPrivateQueueConcurrencyTypeNSMainQueueconCurrencyType为父级。只要performBlock中的一个被调用方法执行获取请求,应用程序就会立即死亡而不会出现任何错误。 OS X控制台输出以下内容:

BUG in libdispatch client: kevent[EVFILT_VNODE] add: "Bad file descriptor" - 0x9

有谁知道造成这种情况的原因是什么?

我正在使用XCode 4.5.2和iOS 6.

更新

我发现此问题仅在SenTestingKit情况下作为静态库发生。如果我将该库包含在常规iOS应用程序中,它就会消失。任何想法?

1 个答案:

答案 0 :(得分:1)

将设计为在后台线程上运行的对象包装到NSBlockOperation中的NSOperationQueue将缓解您的子级和父级上下文之间的队列阻塞错误。

您还应该删除子级上下文的performBlock次调用。 Child自动对其私有队列上的父队列发出请求,该队列使用父上下文performBlock自动调用父上下文。如果你的代码碰巧没有在主线程上运行,你现有的调用将会工作,但是如果它在主线程上运行会导致死锁(子线程和父线程正在锁定主线程),这就是会发生的事情在单元测试中。我见过的唯一一个由Apple记录的地方是2012年WWDC视频。

https://developer.apple.com/videos/wwdc/2012/?id=214