在performBlock
内,我将managedObjectContext
移交给其他使用它进行核心数据访问的方法。 managedObjectContext
是NSPrivateQueueConcurrencyType
,NSMainQueueconCurrencyType
为父级。只要performBlock
中的一个被调用方法执行获取请求,应用程序就会立即死亡而不会出现任何错误。 OS X控制台输出以下内容:
BUG in libdispatch client: kevent[EVFILT_VNODE] add: "Bad file descriptor" - 0x9
有谁知道造成这种情况的原因是什么?
我正在使用XCode 4.5.2和iOS 6.
我发现此问题仅在SenTestingKit
情况下作为静态库发生。如果我将该库包含在常规iOS应用程序中,它就会消失。任何想法?
答案 0 :(得分:1)
将设计为在后台线程上运行的对象包装到NSBlockOperation
中的NSOperationQueue
将缓解您的子级和父级上下文之间的队列阻塞错误。
您还应该删除子级上下文的performBlock
次调用。 Child自动对其私有队列上的父队列发出请求,该队列使用父上下文performBlock
自动调用父上下文。如果你的代码碰巧没有在主线程上运行,你现有的调用将会工作,但是如果它在主线程上运行会导致死锁(子线程和父线程正在锁定主线程),这就是会发生的事情在单元测试中。我见过的唯一一个由Apple记录的地方是2012年WWDC视频。