Semua antrian DISPATCH_QUEUE_PRIORITY_X adalah antrian bersamaan (artinya mereka dapat menjalankan banyak tugas sekaligus), dan FIFO dalam arti bahwa tugas-tugas dalam antrian yang diberikan akan mulai dieksekusi menggunakan urutan "masuk pertama, keluar pertama". Ini dibandingkan dengan antrian utama (dari dispatch_get_main_queue ()), yang merupakan antrian serial (tugas akan mulai dieksekusi dan selesai dieksekusi dalam urutan penerimaannya).
Jadi, jika Anda mengirim 1000 blok dispatch_async () ke DISPATCH_QUEUE_PRIORITY_DEFAULT, tugas-tugas itu akan mulai dieksekusi dalam urutan yang Anda kirim ke antrian. Demikian juga untuk antrian TINGGI, RENDAH, dan LATAR BELAKANG. Apa pun yang Anda kirim ke salah satu antrian ini dijalankan di latar belakang pada utas alternatif, jauh dari utas aplikasi utama Anda. Oleh karena itu, antrian ini cocok untuk menjalankan tugas-tugas seperti pengunduhan latar belakang, kompresi, perhitungan, dll.
Perhatikan bahwa urutan eksekusi adalah FIFO berdasarkan per-antrian. Jadi jika Anda mengirim 1000 dispatch_async () tugas ke empat antrian serentak yang berbeda, membaginya secara merata dan mengirimkannya ke BACKGROUND, LOW, DEFAULT, dan HIGH agar (yaitu Anda menjadwalkan 250 tugas terakhir pada antrian TINGGI), sangat mungkin bahwa tugas pertama yang Anda lihat akan dimulai pada antrian TINGGI karena sistem telah mengambil implikasi Anda bahwa tugas-tugas tersebut harus sampai ke CPU secepat mungkin.
Perhatikan juga bahwa saya mengatakan "akan mulai mengeksekusi secara berurutan", tetapi perlu diingat bahwa sebagai antrian bersamaan, hal-hal tidak harus SELESAI dieksekusi dalam urutan tergantung pada lamanya waktu untuk setiap tugas.
Sesuai Apple:
https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html
Antrian pengiriman bersamaan berguna ketika Anda memiliki banyak tugas yang dapat berjalan secara paralel. Antrian konkuren masih merupakan antrian karena ia membagi tugas dengan urutan masuk pertama, keluar pertama; namun, antrian konkuren dapat memberikan tugas tambahan sebelum tugas sebelumnya selesai. Jumlah aktual tugas yang dijalankan oleh antrian konkuren pada saat tertentu adalah variabel dan dapat berubah secara dinamis karena kondisi dalam aplikasi Anda berubah. Banyak faktor yang mempengaruhi jumlah tugas yang dijalankan oleh antrian bersamaan, termasuk jumlah core yang tersedia, jumlah pekerjaan yang dilakukan oleh proses lain, dan jumlah dan prioritas tugas dalam antrian pengiriman serial lainnya.
Pada dasarnya, jika Anda mengirim 1000 blok dispatch_async () ke antrian DEFAULT, HIGH, LOW, atau BACKGROUND, mereka semua akan mulai mengeksekusi dalam urutan yang Anda kirim. Namun, tugas yang lebih pendek dapat diselesaikan sebelum yang lebih lama. Alasan di balik ini adalah jika ada core CPU yang tersedia atau jika tugas antrian saat ini melakukan pekerjaan komputasi non-intensif (sehingga membuat sistem berpikir itu dapat mengirimkan tugas tambahan secara paralel terlepas dari jumlah inti).
Tingkat konkurensi ditangani sepenuhnya oleh sistem dan didasarkan pada beban sistem dan faktor-faktor lain yang ditentukan secara internal. Ini adalah keindahan Grand Central Dispatch (sistem dispatch_async ()) - Anda cukup menjadikan unit kerja Anda sebagai blok kode, menetapkan prioritas untuk mereka (berdasarkan antrian yang Anda pilih) dan membiarkan sistem menangani sisanya.
Jadi untuk menjawab pertanyaan Anda di atas: Anda sebagian benar. Anda "meminta kode itu" untuk melakukan tugas serentak pada antrian serentak global pada tingkat prioritas yang ditentukan. Kode dalam blok akan dieksekusi di latar belakang dan kode tambahan (serupa) apa pun akan dieksekusi secara potensial paralel tergantung pada penilaian sistem terhadap sumber daya yang tersedia.
Antrian "utama" di sisi lain (dari dispatch_get_main_queue ()) adalah antrian serial (tidak bersamaan). Tugas yang dikirim ke antrian utama akan selalu dijalankan secara berurutan dan akan selalu selesai. Tugas-tugas ini juga akan dieksekusi pada UI Thread sehingga cocok untuk memperbarui UI Anda dengan pesan progres, pemberitahuan penyelesaian, dll.
dispatch_get_global_queue
di dalam Anda tipe variabeldispatch_queue_t myQueue
. Lebih mudah dibaca hanya melewati myQueue ke `` dispatch_async` Anda