Macos 一致调度队列:com.apple.root.default-qos.overmit崩溃

Macos 一致调度队列:com.apple.root.default-qos.overmit崩溃,macos,cocoa,crash,Macos,Cocoa,Crash,有人有过诊断这些车祸的经验吗?我有一个用户一致地获取它们,尽管我发现了一篇与iOS相关的帖子,但我的应用程序并没有在同一类型的操作上崩溃…原因: 在iOS/tvOS中,存在队列/线程,每个线程都有自己的类型或优先级,也称为“服务质量”或简称“QOS”,这意味着cpu应处理此线程的紧急程度,可能是: QOS\u类\u默认值 QOS\u类\u用户\u已启动 QOS_类_实用程序 QOS_类_背景 QOS_类_未指定 QOS\u类\u用户\u交互 一旦您在同一队列中同时运行了太多任务,操作系统就会

有人有过诊断这些车祸的经验吗?我有一个用户一致地获取它们,尽管我发现了一篇与iOS相关的帖子,但我的应用程序并没有在同一类型的操作上崩溃…

原因:

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

  • QOS\u类\u默认值
  • QOS\u类\u用户\u已启动
  • QOS_类_实用程序
  • QOS_类_背景
  • QOS_类_未指定
  • QOS\u类\u用户\u交互
一旦您在同一队列中同时运行了太多任务,操作系统就会通知您,它不能在同一时间以相同的优先级执行所有这些任务(每个队列的堆栈大小都有限制),因此会显示“overmit”,这意味着您已过度提交队列(在您的情况下为“默认QOS”队列)它会退出,因为此时它无法接收更多任务并以您想要的方式执行它们

解决方案:

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

通常开发人员不会考虑这个问题,而是简单地使用主队列,它是默认的优先级/队列,如下所示:

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")
})
// some task to perform
print("This is my task")

要解决此问题(如果应用程序通知您已过度提交主队列),请将其更改为其他队列之一,如下所示:

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")
})
// some task to perform
print("This is my task")
如果不需要后台(或并行)执行,甚至可以完全忽略dispatch_async命令,只需执行如下命令:

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")
})
// some task to perform
print("This is my task")

在Swift 3中改写Shaybc的答案:

DispatchQueue.global(qos: .background).async {
  // some task to perform
  print("This is my task")
})
对于Swift 3使用:

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

我发现,如果您多次尝试执行同步调度队列,就会发生这种情况。(同步调度_队列在工作时由多个线程调用。当队列执行块时,所有线程都在等待块完成。)“(如果应用程序通知您已过度提交主队列)”您如何知道这一点?