0

在一个performBlockI 中,将其移交managedObjectContext给其他使用它进行核心数据访问的方法。themanagedObjectContext是 aNSPrivateQueueConcurrencyType并且有 theNSMainQueueconCurrencyType作为父级。一旦performBlock执行获取请求中的调用方法之一,应用程序就会终止而没有任何错误。OS X 控制台输出以下内容:

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

有谁知道是什么原因造成的?

我正在使用 XCode 4.5.2 和 iOS 6。

更新

我发现这个问题只发生在SenTestingKit静态库的情况下。如果我将库包含到常规的 iOS 应用程序中,它就消失了。有任何想法吗?

4

1 回答 1

1

将设计为在后台线程上运行的对象包装到NSBlockOperationaNSOperationQueue中将减轻子上下文和父上下文之间的队列阻塞错误。

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

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

于 2013-01-23T01:27:35.630 回答