2015-01-14 22 views
30

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

+0

Bazen aynı sorunu yaşıyorum. Buna neyin sebep olduğu hakkında bir fikrim yok. – JackPearse

+9

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

cevap

15

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ğini

genellikle 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çin
dispatch_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") 
+2

"(uygulama, ana sırayı fazla aştığınızı bildirirse)" nasıl bunu biliyor musun? –

2

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