2015-01-14 8 views
30

Jeder hatte Erfahrung bei der Diagnose dieser Abstürze? Ich habe einen einzigen Benutzer sie konsequent bekommen, und obwohl ich ein iOS Zusammenhang Post, meine App nicht gefunden wird auf die gleiche Art von Operation abstürzt ...Konsequente Dispatch Queue: com.apple.root.default-qos.overcommit Absturz

+0

Ich habe das gleiche Problem manchmal. Keine Ahnung, was das verursacht. – JackPearse

+9

Ich habe herausgefunden, dass dies passiert, wenn Sie mehrere Male versuchen, eine sync-dispatch_queue auszuführen. (Die sync dispatch_queue wird von mehreren Threads aufgerufen, während sie weiterarbeitet. Während die Warteschlange den Block ausführt, warten alle Threads auf die Beendigung des Blocks.) – JackPearse

Antwort

15

Grund:

in IOS/TVOS gibt es Warteschlangen/Threads, jeder Thread hat seinen eigenen Typ oder seine eigene Priorität, auch bekannt als "Quality of Service" oder kurz "QOS", was die Dringlichkeitsstufe bedeutet, dass die CPU diesen Thread behandeln sollte, die Möglichkeiten sind:

  • QOS_CLASS_DEFAULT
  • QOS_CLASS_USER_INITIA TED
  • QOS_CLASS_UTILITY
  • QOS_CLASS_BACKGROUND
  • QOS_CLASS_UNSPECIFIED
  • QOS_CLASS_USER_INTERACTIVE

, wenn Sie zu viele Aufgaben zur gleichen Zeit in der gleichen Warteschlange laufen, dann das Betriebssystem benachrichtigt Sie, dass es nicht all diese Aufgaben ausführen kann gleichzeitig in der gleichen Priorität (es gibt eine Begrenzung für die Größe des Stapels für jede Warteschlange), da dort "OverCommit" steht, was bedeutet, dass Sie die Warteschlange überlastet haben (in Ihrem Fall die "Default-QOS" Warteschlange) und es wird beendet, da es keine weiteren Aufgaben erhalten kann Zeit und führen Sie sie auf die Art und Weise, die Sie wollen.

Lösung:

was Sie tun sollten zuerst die „dispatch_async“ -Befehl finden, die diesen Absturz verursacht, dann eine der anderen Warteschlangen verwenden (es bedeutet, erwartete langsamere Reaktion dann für diese Aufgabe erwartet),

in der Regel Entwickler nicht darüber nachdenken, es einfach und Hauptwarteschlange benutzen, die die Standardpriorität ist/wie diese Warteschlange:

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

, um dieses Problem zu beheben (wenn die Anwendung, die Sie darüber informiert, dass Sie haben die Hauptwarteschlange overcommitted) ist es zu einer der anderen Warteschlangen wie folgt zu ändern:

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") 
}) 

, wenn Sie einen Hintergrund benötigen keine (oder parallel) Ausführung, können Sie sogar den dispatch_async Befehl ganz ignorieren und einfach führen Sie Befehle wie folgt aus:

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

"(wenn die App Sie benachrichtigt, dass Sie die Hauptwarteschlange überlastet haben)" wie Weisst du das? –

2

Rewrite Shaybc Antwort in Swift 3:

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

Für swift3 Verwendung

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