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

Jer*_*son 36 crash macos cocoa

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

Sha*_*ybc 21

原因:

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

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

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

解:

您应该做的是首先找到导致此崩溃的"dispatch_async"命令,然后使用其他队列中的一个(这意味着期望该任务的预期响应更慢),

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

dispatch_async(dispatch_get_main_queue()) {
    // some task to perform
    print("This is my task")
}
Run Code Online (Sandbox Code Playgroud)

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

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")
})
Run Code Online (Sandbox Code Playgroud)

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

// some task to perform
print("This is my task")
Run Code Online (Sandbox Code Playgroud)

  • "(如果应用程序通知您已经过度使用主队列)"你怎么知道这个? (6认同)