有人有诊断这些崩溃的经验吗?我有一个用户始终如一地获得它们,尽管我找到了一篇与 iOS 相关的帖子,但我的应用程序在相同类型的操作上并没有崩溃...
最佳答案
原因:
在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")
}
为了解决此问题(如果应用程序通知您已过度使用主队列),请将其更改为其他队列之一,如下所示:
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")
关于macos - 一致调度队列 : com. apple.root.default-qos.overcommit 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27948618/