2015-01-14 5 views
30

Qualcuno ha avuto esperienza nella diagnosi di questi arresti anomali? Ho un singolo utente di ottenere in modo coerente, e anche se ho trovato un posto iOS connessi, la mia app non si blocca sullo stesso tipo di operazione ...Coda di invio coerente: arresto com.apple.root.default-qos.overcommit

+0

Ho lo stesso problema a volte. Non ho idea di cosa lo stia causando. – JackPearse

+9

Ho scoperto che questo succede se provate più volte per eseguire un sync dispatch_queue. (il sync dispatch_queue viene chiamato da diversi thread mentre funziona ancora. Mentre la coda sta eseguendo il blocco, tutti i thread sono in attesa del completamento del blocco.) – JackPearse

risposta

15

Motivo:

in IOS/TVOS ci sono code/thread, ogni thread ha un proprio tipo o priorità noto anche come "qualità del servizio" o per un breve "QOS", che indica il livello di urgenza che la cpu dovrebbe gestire questo thread, le possibilità sono:

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

una volta che si esegue troppi compiti allo stesso tempo nella stessa coda, quindi il sistema operativo avvisa che non è possibile eseguire tutte queste operazioni allo stesso tempo nella stessa priorità (c'è un limite alla dimensione dello stack per ogni coda), lì per esso dice "OverCommit", il che significa che hai commesso troppo tempo sulla coda (nel tuo caso il "Default-QOS") coda) ed esce dal momento che non può ricevere più compiti in questo tempo e li esegui alla moda che vuoi.

soluzione:

ciò che si dovrebbe fare è in primo luogo trovare il comando "dispatch_async" che provoca questo incidente, quindi utilizzare una delle altre code (questo significa in attesa lenta risposta poi prevista per questo compito),

solito sviluppatore non penso su di esso e semplicemente utilizzare coda principale che è la priorità predefinita/coda in questo modo:

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

al fine di risolvere questo problema (se l'applicazione notifica che avete troppo impegnate nella coda principale) è quello di cambiare ad una delle altre code come questo:

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

se non si necessita di uno sfondo (o esecuzione parallela), si può anche ignorare il comando di dispatch_async del tutto e semplicemente eseguire ti comanda in questo modo:

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

"(se l'app ti avvisa di aver sovraccaricato la coda principale)" come conosci questo? –

2

risposta di riscrittura Shaybc a Swift 3:

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

Per uso swift3

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