Mengapa run loop diperlukan saat menggunakan DispatchQueue.main.async di alat baris perintah mac dengan cepat?

Aug 15 2020

Saya menemukan dokumen Apple untuk memahami mengapa saya harus menggunakan run loop untuk mengimplementasikan tugas dalam antrian pengiriman utama.

Menurut dokumen Apple ,

Antrean pengiriman utama adalah antrean serial yang tersedia secara global yang menjalankan tugas di thread utama aplikasi. Antrean ini bekerja dengan run loop aplikasi (jika ada) untuk melakukan interleave eksekusi tugas antrean dengan eksekusi sumber peristiwa lain yang dilampirkan ke run loop. Karena berjalan di thread utama aplikasi Anda, antrean utama sering kali digunakan sebagai titik sinkronisasi utama untuk aplikasi.

tapi tetap saja, saya tidak bisa mengerti 'mengapa' run loop diperlukan. kedengarannya seperti 'itu perlu putaran putaran karena perlu putaran putaran'. Saya akan sangat menghargai jika seseorang menjelaskan kepada saya tentang ini. Terima kasih.

Jawaban

1 matt Aug 15 2020 at 19:37

mengapa saya harus menggunakan run loop untuk mengimplementasikan tugas dalam antrian pengiriman utama

Biasanya tidak, karena Anda sudah menggunakannya!

Dalam sebuah proyek aplikasi, ada main antrian run lingkaran sudah . Misalnya, proyek aplikasi iOS sebenarnya hanyalah satu panggilan raksasa ke UIApplicationMain, yang menyediakan run loop.

Begitulah cara ia dapat duduk di sana menunggu pengguna melakukan sesuatu. Putaran lari adalah, eh, lari. Dan perulangan.

Namun, katakanlah, alat baris perintah Mac, tidak ada putaran otomatis. Ini menjalankan fungsi utamanya dan segera keluar. Jika Anda membutuhkannya untuk tidak melakukan itu, Anda akan menyediakan run loop.

1 KavinduChathuranga Aug 15 2020 at 18:52

DispatchQueue.main.async adalah saat Anda menjalankan kode di antrean latar belakang dan Anda memerlukan blok kode tertentu untuk dieksekusi di antrean utama.

Dalam kode Anda, viewDidLoadsudah berjalan di antrian utama jadi ada sedikit alasan untuk menggunakan DispatchQueue.main.async.

Namun belum tentu salah menggunakannya. Tapi itu mengubah urutan eksekusi.

penutupan asinkron diantrekan untuk dijalankan setelah runloop saat ini selesai.

Rob Aug 15 2020 at 23:56

saya tidak bisa mengerti 'mengapa' run loop diperlukan

Umumnya, run loop tidak diperlukan untuk aplikasi baris perintah. Anda dapat menggunakan run loop jika Anda memiliki kebutuhan khusus (misalnya, Anda memiliki beberapa UI dinamis yang menjalankan beberapa tugas sambil menunggu input pengguna), tetapi sebagian besar aplikasi baris perintah tidak memerlukan run loop.

Seperti yang dikatakan dokumen :

Run loop adalah loop pemrosesan peristiwa yang Anda gunakan untuk menjadwalkan pekerjaan dan mengoordinasikan penerimaan peristiwa yang masuk. Tujuan dari putaran jalan adalah untuk membuat utas Anda tetap sibuk saat ada pekerjaan yang harus dilakukan dan meletakkan utas Anda ke mode tidur ketika tidak ada.

Jadi, jika Anda ingin aplikasi Anda menunggu beberapa peristiwa masuk atau Anda mengirimkan tugas secara asinkron antar antrian, maka, baiklah, gunakan run loop, tetapi sebaliknya, jangan repot-repot. Sebagian besar aplikasi baris perintah sama sekali tidak perlu menggunakan run loop.