Tüm DISPATCH_QUEUE_PRIORITY_X kuyrukları eşzamanlı kuyruklardır (yani aynı anda birden fazla görevi yürütebilecekleri anlamına gelir) ve belirli bir kuyruktaki görevlerin "ilk giren ilk çıkar" sırası kullanılarak yürütülmeye başlaması anlamında FIFO'dur. Bu, ana kuyrukla (seri kuyruğu olan dispatch_get_main_queue () kaynağından) karşılaştırılır (görevler yürütülmeye başlanır ve alınma sırasına göre tamamlanır).
Bu nedenle, DISPATCH_QUEUE_PRIORITY_DEFAULT'a 1000 dispatch_async () bloğu gönderirseniz, bu görevler kuyruğa gönderdiğiniz sırayla yürütülmeye başlar. Aynı şekilde YÜKSEK, DÜŞÜK ve ARKA PLAN kuyrukları için. Bu kuyruklardan herhangi birine gönderdiğiniz her şey, ana uygulama iş parçanızdan uzakta alternatif iş parçacıklarında arka planda yürütülür. Bu nedenle, bu kuyruklar arka plan indirme, sıkıştırma, hesaplama vb. Görevleri yürütmek için uygundur.
Yürütme sırasının kuyruk başına temelinde FIFO olduğunu unutmayın. Bu nedenle, dört farklı eşzamanlı kuyruğa 1000 dispatch_async () görevi gönderirseniz, bunları eşit olarak böler ve sırasıyla ARKA PLAN, DÜŞÜK, VARSAYILAN ve YÜKSEK'e gönderirseniz (yani, YÜKSEK kuyruktaki son 250 görevi zamanlarsınız) başlangıçta gördüğünüz ilk görevler, sistem bu görevlerin CPU'ya olabildiğince çabuk ulaşması gerektiği anlamına geldiğinden YÜKSEK kuyrukta olacaktır.
Ayrıca "sırayla yürütmeye başlayacağımı" söylüyorum, ancak eşzamanlı sıralar olarak her görev için sürenin uzunluğuna bağlı olarak bir şeyin zorunlu olarak yürütmeyi bitirmeyeceğini unutmayın.
Apple'a göre:
https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html
Paralel olarak çalışabilen birden fazla göreviniz olduğunda, eşzamanlı bir gönderme kuyruğu yararlıdır. Eşzamanlı bir kuyruk, görevleri bir ilk giren ilk çıkar sırasına göre ayıkladığı için hala bir kuyruktur; ancak, eşzamanlı bir kuyruk önceki görevler tamamlanmadan önce ek görevleri aldatabilir. Herhangi bir anda eşzamanlı bir kuyruk tarafından yürütülen gerçek görev sayısı değişkendir ve uygulamanızdaki koşullar değiştikçe dinamik olarak değişebilir. Kullanılabilir çekirdeklerin sayısı, diğer işlemler tarafından yapılan iş miktarı ve diğer seri dağıtım kuyruklarındaki görevlerin sayısı ve önceliği dahil olmak üzere, eşzamanlı kuyruklar tarafından yürütülen görevlerin sayısını etkiler.
Temel olarak, bu 1000 dispatch_async () bloğunu bir VARSAYILAN, YÜKSEK, DÜŞÜK veya ARKA PLAN kuyruğuna gönderirseniz, tümü bunları gönderdiğiniz sırayla yürütmeye başlayacaktır. Ancak, kısa görevler daha uzun görevlerden önce bitebilir. Bunun arkasındaki nedenler, kullanılabilir CPU çekirdeği olup olmadığı veya mevcut kuyruk görevlerinin hesaplamalı olarak yoğun olmayan bir iş yapmasıdır (böylece sistemin, çekirdek sayısına bakılmaksızın ek görevler gönderebileceğini düşünmesini sağlar).
Eşzamanlılık düzeyi tamamen sistem tarafından ele alınır ve sistem yüküne ve dahili olarak belirlenen diğer faktörlere dayanır. Bu, Grand Central Dispatch (dispatch_async () sisteminin) güzelliğidir - sadece çalışma ünitelerinizi kod bloğu olarak yapar, onlar için bir öncelik ayarlarsınız (seçtiğiniz kuyruğa göre) ve sistemin geri kalanını halletmesine izin verirsiniz.
Yukarıdaki sorunuza cevap vermek için: kısmen haklısınız. "Bu kodu, belirtilen öncelik düzeyinde bir genel eşzamanlı kuyrukta eşzamanlı görevler gerçekleştirmesini istiyorsunuz. Bloktaki kod arka planda yürütülür ve diğer (benzer) kodlar, sistemin kullanılabilir kaynakları değerlendirmesine bağlı olarak potansiyel olarak paralel olarak yürütülür.
Öte yandan "ana" kuyruk (dispatch_get_main_queue () 'den) bir seri kuyruktur (eşzamanlı değil). Ana kuyruğa gönderilen görevler her zaman sırayla yürütülür ve her zaman sırayla tamamlanır. Bu görevler UI İş Parçacığında da yürütülür, böylece kullanıcı arayüzünüzü ilerleme mesajları, tamamlama bildirimleri vb. İle güncellemek için uygundur.
dispatch_get_global_queue
değişken bir tür içinde güvenlidispatch_queue_t myQueue
. Daha okunabilir `` dispatch_async '' e sadece myQueue iletiliyor