Bu çökmelerde teşhis deneyimi olan var mı? Ben tek bir kullanıcı sürekli olarak onları almak var ve iOS ilgili yazı bulundu rağmen, benim appTutarlı Sevkiyat sırası: com.apple.root.default-qos.overcommit crash
cevap
Sebep ... operasyonun aynı tip çökmesini değildir: IOS/TVOS içinde
vardır kuyruk/iş parçacığı, her iş parçacığı, "hizmet kalitesi" veya kısa "QOS" olarak bilinen kendi türüne veya önceliğine sahiptir, bu da cpu'nun bu iş parçacığıyla ilgilenmesi gereken aciliyet düzeyi anlamına gelir, olasılıklar şunlardır:
- QOS_CLASS_DEFAULT
- QOS_CLASS_USER_INITIA TED
- QOS_CLASS_UTILITY
- QOS_CLASS_BACKGROUND
- QOS_CLASS_UNSPECIFIED
- QOS_CLASS_USER_INTERACTIVE
aynı kuyrukta aynı anda birçok işi çalıştırmak kez, daha sonra OS hepsi bu görevleri yerine olamayacağını bildirir Aynı önceliğe aynı anda (her sıra için yığının boyutuna bir sınır vardır), orada "OverCommit" yazıyor, bu da sıraya göre işlem yaptığınız anlamına gelir (sizin durumunuzda "Default-QOS" sıra) ve bu konuda daha fazla görev alamadığı için çıkar zaman ve istediğin şekilde onları yürüt.
çözüm:
ilk o zaman, bu çökertmesidir "dispatch_async" komutunu bulmak diğer kuyruklar birini (daha sonra bu görev için beklenen daha yavaş bir tepki bekliyor demektir),
kullanmak olduğunu ne yapması gerektiğinigenellikle geliştirici bunu düşünmek ve sadece varsayılan öncelik ana kuyruk kullanmayın/böyle kuyruklarda:
uygulama olduğunu bildirmesi halinde (bunu düzeltmek içindispatch_async(dispatch_get_main_queue()) {
// some task to perform
print("This is my task")
}
hatta tamamen ve sadece dispatch_async komutu yok sayabilirsiniz, bir arka plan (veya paralel) işletilmesi gerektiğini yoksa
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")
})
: siz) ana kuyruğunu overcommitted gelmiş böyle diğer kuyruklardan birine değiştirmektir yürütmek böyle komutları:
// some task to perform
print("This is my task")
"(uygulama, ana sırayı fazla aştığınızı bildirirse)" nasıl bunu biliyor musun? –
Swift 3 Yeniden Yazma Shaybc cevabı: swift3 kullanım için
DispatchQueue.global(qos: .background).async {
// some task to perform
print("This is my task")
})
Bazen aynı sorunu yaşıyorum. Buna neyin sebep olduğu hakkında bir fikrim yok. – JackPearse
Bir sync dispatch_queue yürütmek için birden çok kez denerseniz, bu durumun oluştuğunu öğrendim. (sync dispatch_queue, hala çalışırken çalışırken birkaç iş parçacığı tarafından çağrılır. Sıra blok çalışırken, tüm iş parçacıkları bloğun bitmesini bekler.) – JackPearse