在performBlock
中,我将其managementObjectContext
移交给其他使用它进行核心数据访问的方法。 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 应用程序中,它就会消失。有什么想法吗?
最佳答案
将设计为在后台线程上运行的对象包装到 NSOperationQueue
中的 NSBlockOperation
中,将减轻子上下文和父上下文之间的队列阻塞错误。
您还应该删除子上下文的 performBlock
调用。子级自动在其私有(private)队列上向父队列发出请求,该队列自动使用父上下文 performBlock
调用父上下文。如果您的代码碰巧不在主线程上运行,您现有的调用将起作用,但如果它在主线程上运行(子级和父级正在锁定主线程),则会导致死锁,这就是发生的情况在单元测试中。我唯一见过 Apple 对此进行记录的地方是在 2012 年 WWDC 视频中。
关于ios - 从 PerformBlock NPSPrivateQueueConcurrencyType 调用的方法中的 FetchRequest 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14461377/