一致的Dispatch队列:com.apple.root.default-qos.overcommit崩溃

时间:2015-01-14 17:11:34

标签: macos cocoa crash

任何人都有诊断这些崩溃的经验吗?我有一个用户一致地得到它们,虽然我发现了一个与iOS相关的帖子,但我的应用程序并没有在相同类型的操作上崩溃......

3 个答案:

答案 0 :(得分:19)

<强>原因:

在iOS / tvOS中有队列/线程,每个线程都有自己的类型或优先级,也称为&#34;服务质量&#34;或者简称&#34; QOS&#34;,这意味着cpu应该处理这个线程的紧迫程度,可能性是:

  • QOS_CLASS_DEFAULT
  • QOS_CLASS_USER_INITIATED
  • QOS_CLASS_UTILITY
  • QOS_CLASS_BACKGROUND
  • QOS_CLASS_UNSPECIFIED
  • QOS_CLASS_USER_INTERACTIVE

一旦在同一队列中同时运行太多任务,操作系统会通知您它无法以相同的优先级同时执行所有这些任务(堆栈大小有限制)每个队列),因为它说&#34; OverCommit&#34;,这意味着你已经过了提交队列(在你的情况下是&#34;默认-QOS&#34;队列)并且它退出,因为它无法接收更多此时的任务并以你想要的方式执行它们。

<强>溶液

你应该做的是先找到&#34; dispatch_async&#34;导致此崩溃的命令,然后使用其他队列之一(这意味着期望该任务的预期响应速度较慢),

通常开发人员不会考虑它,只需使用主队列,这是默认的优先级/队列,如下所示:

dispatch_async(dispatch_get_main_queue()) {
    // some task to perform
    print("This is my task")
}

为了解决这个问题(如果应用程序通知您已经过度使用了主队列),请将其更改为其他队列,如下所示:

let qualityOfServiceClass = QOS_CLASS_BACKGROUND
let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
dispatch_async(backgroundQueue, {
    // some task to perform
    print("This is my task")
})

如果您不需要后台(或并行)执行,您甚至可以完全忽略dispatch_async命令,只需执行如下命令:

// some task to perform
print("This is my task")

答案 1 :(得分:2)

重写Shaybc在Swift 3中的回答:

DispatchQueue.global(qos: .background).async {
  // some task to perform
  print("This is my task")
})

答案 2 :(得分:1)

对于Swift 3使用:

DispatchQueue.global(qos: DispatchQoS.QoSClass.background).async { 
    // ... 
}