Run loop adalah abstraksi yang (antara lain) menyediakan mekanisme untuk menangani sumber input sistem (soket, port, file, keyboard, mouse, timer, dll).
Setiap NSThread memiliki run loopnya sendiri, yang dapat diakses melalui metode currentRunLoop.
Secara umum, Anda tidak perlu mengakses run loop secara langsung, meskipun ada beberapa komponen (jaringan) yang memungkinkan Anda menentukan loop run mana yang akan mereka gunakan untuk pemrosesan I / O.
Run loop untuk thread tertentu akan menunggu hingga satu atau beberapa sumber inputnya memiliki beberapa data atau peristiwa, lalu mengaktifkan penangan input yang sesuai untuk memproses setiap sumber input yang "siap".
Setelah melakukannya, ia akan kembali ke loopnya, memproses masukan dari berbagai sumber, dan "tidur" jika tidak ada pekerjaan yang harus dilakukan.
Itu adalah deskripsi tingkat tinggi (mencoba menghindari terlalu banyak detail).
EDIT
Upaya untuk menanggapi komentar. Saya memecahnya menjadi beberapa bagian.
- itu berarti saya hanya dapat mengakses / menjalankan untuk menjalankan loop di dalam utas, bukan?
Memang. NSRunLoop bukanlah thread safe, dan hanya boleh diakses dari konteks thread yang menjalankan loop.
- apakah ada contoh sederhana bagaimana menambahkan event untuk menjalankan loop?
Jika Anda ingin memantau sebuah port, Anda cukup menambahkan port tersebut ke loop run, dan run loop akan mengawasi aktivitas port tersebut.
- (void)addPort:(NSPort *)aPort forMode:(NSString *)mode
Anda juga dapat menambahkan timer secara eksplisit dengan
- (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode
- apa artinya itu akan kembali ke loopnya?
Run loop akan memproses semua event yang siap setiap iterasi (sesuai dengan modenya). Anda perlu melihat dokumentasi untuk mengetahui tentang mode jalan, karena itu sedikit di luar cakupan jawaban umum.
- apakah run loop tidak aktif ketika saya memulai utas?
Di sebagian besar aplikasi, run loop utama akan berjalan secara otomatis. Namun, Anda bertanggung jawab untuk memulai putaran proses dan merespons peristiwa masuk untuk utas yang Anda putar.
- apakah mungkin untuk menambahkan beberapa event ke loop run Thread di luar thread?
Saya tidak yakin apa yang Anda maksud di sini. Anda tidak menambahkan acara ke run loop. Anda menambahkan sumber input dan sumber pengatur waktu (dari utas yang memiliki run loop). Run loop kemudian mengawasi mereka untuk aktivitas. Anda tentu saja dapat memberikan masukan data dari thread dan proses lain, tetapi masukan akan diproses oleh run loop yang memantau sumber-sumber tersebut di thread yang menjalankan loop jalan.
- apakah itu berarti bahwa terkadang saya dapat menggunakan run loop untuk memblokir utas untuk suatu waktu
Memang. Nyatanya, run loop akan "tetap" di event handler sampai event handler itu kembali. Anda dapat melihat ini di aplikasi apa pun dengan cukup sederhana. Pasang penangan untuk setiap tindakan IO (mis., Menekan tombol) yang tidur. Anda akan memblokir loop proses utama (dan seluruh UI) hingga metode tersebut selesai.
Hal yang sama berlaku untuk semua run loop.
Saya sarankan Anda membaca dokumentasi berikut tentang run loop:
https://developer.apple.com/documentation/foundation/nsrunloop
dan bagaimana mereka digunakan dalam utas:
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW1