Perché è necessario eseguire il ciclo quando si utilizza DispatchQueue.main.async nello strumento da riga di comando Mac in Swift?

Aug 15 2020

Ho trovato il documento di Apple per capire perché dovrei usare il ciclo di esecuzione per implementare l'attività nella coda di spedizione principale.

Secondo i documenti Apple ,

La coda di invio principale è una coda seriale disponibile a livello globale che esegue attività sul thread principale dell'applicazione. Questa coda funziona con il ciclo di esecuzione dell'applicazione (se presente) per alternare l'esecuzione delle attività in coda con l'esecuzione di altre origini evento collegate al ciclo di esecuzione. Poiché viene eseguito sul thread principale dell'applicazione, la coda principale viene spesso utilizzata come punto di sincronizzazione chiave per un'applicazione.

ma ancora, non riesco a capire "perché" è necessario il ciclo di esecuzione. suona come "ha bisogno di un ciclo di esecuzione perché ha bisogno di un ciclo di esecuzione". Apprezzerò molto se qualcuno mi spieghi questo. Grazie.

Risposte

1 matt Aug 15 2020 at 19:37

perché dovrei usare il ciclo di esecuzione per implementare l'attività nella coda di invio principale

Normalmente non lo fai, perché ne stai già usando uno!

In un progetto di applicazione, è già presente un ciclo di esecuzione della coda principale . Ad esempio, un progetto di app iOS in realtà non è altro che una gigantesca chiamata a UIApplicationMain, che fornisce un ciclo di esecuzione.

È così che è in grado di sedersi lì in attesa che l'utente faccia qualcosa. Il ciclo di esecuzione è, uh, in esecuzione. E in loop.

Ma, ad esempio, in uno strumento da riga di comando Mac, non esiste un ciclo di esecuzione automatico. Esegue la sua funzione principale ed esce immediatamente. Se ne avessi bisogno per non farlo, forniresti un ciclo di esecuzione.

1 KavinduChathuranga Aug 15 2020 at 18:52

DispatchQueue.main.asyncè quando hai il codice in esecuzione su una coda in background e hai bisogno di un blocco specifico di codice da eseguire sulla coda principale.

Nel tuo codice, viewDidLoadè già in esecuzione sulla coda principale, quindi non ci sono motivi per utilizzare DispatchQueue.main.async.

Ma non è necessariamente sbagliato usarlo. Ma cambia l'ordine di esecuzione.

la chiusura asincrona viene messa in coda per essere eseguita dopo il completamento del runloop corrente.

Rob Aug 15 2020 at 23:56

non riesco a capire "perché" è necessario il ciclo di esecuzione

In genere, un ciclo di esecuzione non è necessario per le app della riga di comando. Puoi utilizzare i cicli di esecuzione se ne hai un'esigenza particolare (ad esempio, hai un'interfaccia utente dinamica che esegue alcune attività mentre aspetti l'input dell'utente), ma la stragrande maggioranza delle app della riga di comando non richiede cicli di esecuzione.

Come dicono i documenti :

Un ciclo di esecuzione è un ciclo di elaborazione degli eventi utilizzato per programmare il lavoro e coordinare la ricezione degli eventi in arrivo. Lo scopo di un ciclo di esecuzione è mantenere il thread occupato quando c'è del lavoro da fare e mettere il thread in stato di stop quando non ce n'è.

Quindi, se devi fare in modo che la tua app attenda alcuni eventi in arrivo o stai inviando attività in modo asincrono tra le code, allora, bene, utilizza i cicli di esecuzione, ma per il resto non preoccuparti. La maggior parte delle app della riga di comando non ha bisogno di utilizzare i cicli di esecuzione.