Saya telah menggunakan dengan sukses, pengiriman grand central di aplikasi saya, tetapi saya bertanya-tanya apa keuntungan sebenarnya dari menggunakan sesuatu seperti ini:
dispatch_async(dispatch_get_main_queue(), ^{ ... do stuff
atau bahkan
dispatch_sync(dispatch_get_main_queue(), ^{ ... do stuff
Maksud saya, dalam kedua kasus Anda menembakkan blok yang akan dieksekusi pada utas utama, tepat di mana aplikasi berjalan dan ini tidak akan membantu mengurangi beban. Dalam kasus pertama, Anda tidak memiliki kontrol saat blok akan berjalan. Saya telah melihat kasus blok dieksekusi setengah detik setelah Anda memecat mereka. Kasus kedua, mirip dengan
[self doStuff];
Baik?
Aku ingin tahu apa yang kalian pikirkan.
Jawaban:
Pengiriman blok ke antrian utama biasanya dilakukan dari antrian latar belakang untuk memberi sinyal bahwa beberapa pemrosesan latar belakang telah selesai misalnya
Dalam hal ini, kami melakukan perhitungan panjang pada antrian latar belakang dan perlu memperbarui UI kami ketika perhitungan selesai. Memperbarui UI biasanya harus dilakukan dari antrian utama sehingga kami 'memberi sinyal' kembali ke antrian utama menggunakan dispatch_async bersarang kedua.
Mungkin ada contoh lain di mana Anda mungkin ingin mengirim kembali ke antrian utama tetapi umumnya dilakukan dengan cara ini yaitu bersarang dari dalam blok yang dikirim ke antrian latar belakang.
Mengenai mengapa Anda mungkin ingin mengirim ke antrian utama dari antrian utama ... Yah, Anda biasanya tidak akan berpikir bahwa Anda mungkin melakukannya untuk menjadwalkan beberapa pekerjaan yang akan dilakukan di putaran run loop berikutnya.
sumber
Mengirim blok ke antrian utama dari can utama bermanfaat. Ini memberi antrian utama peluang untuk menangani blok lain yang telah di-antri sehingga Anda tidak hanya memblokir segala sesuatu yang lain dari eksekusi.
Misalnya, Anda dapat menulis server ulir tunggal yang pada dasarnya menangani banyak koneksi bersamaan. Selama tidak ada blok individual dalam antrian yang terlalu lama server tetap responsif terhadap permintaan baru.
Jika program Anda tidak melakukan apa pun kecuali menghabiskan seluruh hidupnya untuk merespons berbagai peristiwa, maka ini bisa sangat wajar. Anda cukup mengatur handler acara Anda untuk berjalan di antrian utama dan kemudian memanggil dispatch_main (), dan Anda mungkin tidak perlu khawatir tentang keamanan utas sama sekali.
sumber
Semoga saya memahami pertanyaan Anda dengan benar karena Anda bertanya-tanya tentang perbedaan antara dispatch_async dan dispatch_sync?
akan mengirimkan blok ke antrian secara tidak sinkron. Berarti itu akan mengirim blok ke antrian dan tidak menunggu untuk kembali sebelum melanjutkan eksekusi kode yang tersisa dalam metode Anda.
akan mengirim blok ke antrian secara serempak. Ini akan mencegah eksekusi kode yang tersisa dalam metode sampai blok selesai dieksekusi.
Saya sebagian besar menggunakan
dispatch_async
antrian latar belakang untuk mulai bekerja dari antrian utama dan memanfaatkan setiap core tambahan yang mungkin dimiliki perangkat. Kemudiandispatch_async
ke utas utama jika saya perlu memperbarui UI.Semoga berhasil
sumber
Satu tempat yang bermanfaat adalah untuk aktivitas UI, seperti mengatur pemintal sebelum operasi yang panjang:
tidak akan berfungsi, karena Anda memblokir utas selama hal panjang Anda dan tidak membiarkan UIKit benar-benar memulai pemintal.
akan mengembalikan kontrol ke run loop, yang akan menjadwalkan pembaruan UI, memulai pemintal, kemudian akan mendapatkan hal berikutnya dari antrian pengiriman, yang merupakan pemrosesan aktual Anda. Ketika pemrosesan Anda selesai, animasi berhenti dipanggil, dan Anda kembali ke loop dijalankan, di mana UI kemudian diperbarui dengan berhenti.
sumber
Swift 3, 4 & 5
Menjalankan kode di utas utama
sumber
Async berarti asinkron dan Anda harus sering menggunakannya. Anda seharusnya tidak pernah memanggil sinkronisasi pada utas utama karena itu akan mengunci UI Anda sampai tugas selesai. Anda di sini adalah cara yang lebih baik untuk melakukan ini di Swift:
Termasuk dalam fungsi standar dalam repo saya, lihat: https://github.com/goktugyil/EZSwiftExtensions
sumber