ios - 从 PerformBlock NPSPrivateQueueConcurrencyType 调用的方法中的 FetchRequest 失败

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

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 视频中。

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

关于ios - 从 PerformBlock NPSPrivateQueueConcurrencyType 调用的方法中的 FetchRequest 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14461377/

相关文章:

iphone - 如何在不使用图像的情况下以编程方式将自定义宽度的 UIBarButtonItem 添加到 UINavigationItem

iphone - 我如何检查 NSArray 中是否存在特定的 NSString?

ios - 按距离对 UITableView 进行排序/排序

ios - 引用 UINavigationBar 上的后退按钮

ios - Swift - 拍照或选择现有的

iphone - 如何将 NSArray 用作全局常量?

facebook - iOS Facebook SDK 3.2 通过图路径请求检查权限

ios - 在 Storyboard中支持 UIViewController 的纵向方向模式

objective-c - 在其他对象内的容器中添加对象对于 arc 为 null

iphone - 为 iPad 和 iPhone 运行时创建不同的@properties