任何人都有诊断这些崩溃的经验吗?我有一个用户一致地得到它们,虽然我发现了一个与iOS相关的帖子,但我的应用程序并没有在相同类型的操作上崩溃......
答案 0 :(得分:19)
<强>原因:强>
在iOS / tvOS中有队列/线程,每个线程都有自己的类型或优先级,也称为&#34;服务质量&#34;或者简称&#34; QOS&#34;,这意味着cpu应该处理这个线程的紧迫程度,可能性是:一旦在同一队列中同时运行太多任务,操作系统会通知您它无法以相同的优先级同时执行所有这些任务(堆栈大小有限制)每个队列),因为它说&#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 {
// ...
}