Un ciclo di esecuzione è un'astrazione che (tra le altre cose) fornisce un meccanismo per gestire le sorgenti di input del sistema (socket, porte, file, tastiera, mouse, timer, ecc.).
Ogni NSThread ha il proprio ciclo di esecuzione, a cui è possibile accedere tramite il metodo currentRunLoop.
In generale, non è necessario accedere direttamente al ciclo di esecuzione, sebbene vi siano alcuni componenti (di rete) che potrebbero consentire di specificare quale ciclo di esecuzione utilizzeranno per l'elaborazione I / O.
Un ciclo di esecuzione per un dato thread attenderà fino a quando una o più delle sue origini di input non avrà alcuni dati o eventi, quindi attiverà i gestori di input appropriati per elaborare ciascuna fonte di input "pronta".
Dopo averlo fatto, tornerà al suo ciclo, elaborando l'input da varie fonti e "dormendo" se non c'è lavoro da fare.
Questa è una descrizione di livello piuttosto alto (cercando di evitare troppi dettagli).
MODIFICARE
Un tentativo di affrontare il commento. L'ho fatto a pezzi.
- significa che posso accedere / eseguire solo per eseguire il ciclo all'interno del thread giusto?
Infatti. NSRunLoop non è thread-safe e dovrebbe essere accessibile solo dal contesto del thread che esegue il ciclo.
- c'è un semplice esempio su come aggiungere un evento per eseguire il ciclo?
Se si desidera monitorare una porta, è sufficiente aggiungere quella porta al ciclo di esecuzione, quindi il ciclo di esecuzione controllerà l'attività della porta.
- (void)addPort:(NSPort *)aPort forMode:(NSString *)mode
Puoi anche aggiungere un timer esplicitamente con
- (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode
- cosa significa che tornerà al suo ciclo?
Il ciclo di esecuzione elaborerà tutti gli eventi pronti a ogni iterazione (in base alla sua modalità). Avrai bisogno di guardare la documentazione per scoprire le modalità di esecuzione, poiché è un po 'oltre lo scopo di una risposta generale.
- run loop è inattivo quando avvio il thread?
Nella maggior parte delle applicazioni, il ciclo di esecuzione principale verrà eseguito automaticamente. Tuttavia, sei responsabile dell'avvio del ciclo di esecuzione e della risposta agli eventi in arrivo per i thread che giri.
- è possibile aggiungere alcuni eventi al ciclo di esecuzione del thread al di fuori del thread?
Non sono sicuro di cosa intendi qui. Non aggiungi eventi al ciclo di esecuzione. Si aggiungono origini di input e origini timer (dal thread che possiede il ciclo di esecuzione). Il ciclo di corsa quindi li guarda per l'attività. È possibile, ovviamente, fornire l'input di dati da altri thread e processi, ma l'input verrà elaborato dal ciclo di esecuzione che monitora quelle origini sul thread che esegue il ciclo di esecuzione.
- significa che a volte posso usare run loop per bloccare il thread per un po '
Infatti. Infatti, un ciclo di esecuzione "rimarrà" in un gestore di eventi fino a quando non sarà restituito. Puoi vederlo in qualsiasi app in modo abbastanza semplice. Installa un gestore per qualsiasi azione IO (ad esempio, pressione di un pulsante) che dorme. Bloccherai il ciclo di esecuzione principale (e l'intera interfaccia utente) fino al completamento di quel metodo.
Lo stesso vale per qualsiasi ciclo di esecuzione.
Ti suggerisco di leggere la seguente documentazione sui cicli di esecuzione:
https://developer.apple.com/documentation/foundation/nsrunloop
e come vengono utilizzati all'interno dei thread:
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW1