https://www.raywenderlich.com/5370-grand-central-dispatch-tutorial-for-swift-4-part-1-2

Questa è la continuazione della concorrenza nella serie swift. Vedere la parte 1 e la parte 2 di comprendere le nozioni di base

In questa parte verrà coprono i seguenti argomenti

  1. Quali sono le Operazioni e gli stati di Vita
  2. Crea Blocco, NSInvocationOperation , e Operazioni Personalizzate per eseguire le operazioni asincrone
  3. Come le operazioni di annullamento
  4. Quello che è il Funzionamento Code
  5. Come aggiungere Operazioni di Funzionamento Code
  6. Come creare le dipendenze tra le Operazioni di
  7. i Vantaggi dell’Operazione di Code di Oltre GCD
  8. Spedizione di Gruppo, Implementazione Tramite Operazione di Code

le Operazioni sono un modo orientato agli oggetti per incapsulare il lavoro che si desidera eseguire in modo asincrono. Le operazioni sono progettate per essere utilizzate in combinazione con una coda di operazioni o da sole

Un oggetto operation è un’istanza della classe Operation or NSOperation (nel framework Foundation) che si utilizza per incapsulare il lavoro che si desidera eseguire l’applicazione.

La classe Operation stessa è una classe base astratta che deve essere sottoclassata per eseguire qualsiasi lavoro utile. Nonostante sia astratto, questa classe fornisce una quantità significativa di infrastruttura per ridurre al minimo la quantità di lavoro che devi fare nelle tue sottoclassi. Inoltre, il framework Foundation fornisce due sottoclassi concrete che è possibile utilizzare così com’è con il codice esistente.

Stato delle operazioni

Un’operazione ha una macchina a stati che rappresenta il suo ciclo di vita. Ci sono diversi stati possibili che si verificano in varie parti di questo ciclo di vita:

  • Quando è stato instantiated, passerà allo stato isReady.
  • Quando abbiamo invocato il metodo start, passerà allo stato isExecuting.
  • Quando il task finished , si muove a isFinished
  • Quando l’attività è in corso e si chiama cancel , poi il passaggio al isCancelled stato prima di muoversi verso il isFinished stato

Ci sono principalmente tre modi per creare operazioni

BlockOperation (Classe di Calcestruzzo)

Una classe si usa per eseguire uno o più oggetti di blocco contemporaneamente. Poiché può eseguire più di un blocco, un oggetto Operazione di blocco opera utilizzando una semantica di gruppo; solo quando tutti i blocchi associati hanno terminato l’esecuzione, l’operazione stessa viene considerata terminata.. In operazione di blocco è possibile usufruire di dipendenze di funzionamento, KVO, notifiche e cancellazione .

, Come mostrato in Figura 1 abbiamo eseguito questo codice async il che significa che verrà restituito immediatamente, ma la cattiva notizia è che si blocca il thread principale, visto che operation.start() è stato chiamato sul thread principale

il Funzionamento di oggetti di eseguire in modo sincrono per impostazione predefinita, che è, essi svolgono la loro attività nel thread che chiama la loro start metodo.

Figura 1

Che diamine è modo sincrono ed eseguire uno o più oggetti di blocco contemporaneamente.

, Come mostrato in Figura 1.0.1, come si può vedere le attività/blocchi aggiunto al Blocco operazione eseguita simultaneamente, ma il blocco di funzionare in modo sincrono modo significa che ha bloccato il thread in cui inizio è chiamato nel nostro caso è il thread principale

Figura 1.0.1

Come mostrato in Figura Figura 1.0.2 , dal momento che noi chiamiamo metodo start su altri thread , blocca il thread

Figura 1.0.2

Come mostrato in Figura Figura 1.0.3, possiamo aggiungere completamento blocco che verrà chiamata quando tutti i concorrenti blocchi eseguiti

Figura 1.0.3

Eseguire operazioni di Blocco Contemporaneamente

, Come mostrato in Figura 1.1 poiché chiamiamo il metodo start() su un thread in background, eseguirà il loro compito nel thread. C’è un modo interessante per farlo usando la coda delle operazioni e lo vedremo più avanti.

Figura 1.1

NSInvocationOperation (Classe di Calcestruzzo)

Una classe si usa per creare un’operazione oggetto basato su un oggetto e selettore di applicazione.

In objective C possiamo creare NSInvocationOperation mentre non è disponibile in Swift.

https://developer.apple.com/library/archive/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationObjects/OperationObjects.html#//apple_ref/doc/uid/TP40008091-CH101-SW6

3. Operazioni personalizzate

Sottoclasse Operation consente il controllo completo sull’implementazione delle proprie operazioni, inclusa la possibilità di modificare il modo predefinito in cui l’operazione viene eseguita e riporta il suo stato.

Come mostrato in Figura 2 abbiamo creato operazioni personalizzate per sottoclasse da Operation classe base e sovrascrivere il suo main metodo. Quando si sottoclasse si inserisce l’attività sul metodo main. Abbiamo implementato non simultanee operazione personalizzata e in questo caso abbiamo bloccato il thread principale

Figura 2

Se si prevede di eseguire operazioni ancora manualmente e desidera loro di eseguire in modo asincrono, è necessario intraprendere le azioni appropriate per assicurare che essi fanno. A tale scopo, definendo l’oggetto operazione come un’operazione concorrente.

Come mostrato in Figura 3 abbiamo eseguito le seguenti operazioni per eseguire attività contemporaneamente

  1. Creato sottoclasse MyConcurrentQueue. Battitura: Il nome dovrebbe essere MyConcurrentOperations
  2. Chiama start() metodo si chiama main() metodo di thread in background
  3. Sul metodo principale con cui abbiamo definito il nostro compito e una cosa da notare siamo in grado di soddisfare annullare caso
  4. Sulla chiamata cancel custom operazione sarà di transizione per il isCancelled stato e rompere il ciclo e come mostrato in Figura 3 viene stampata solo 39487 elementi

Figura 3

Operazione Code

  1. Operazioni di Code di Cacao ad alto livello di astrazione sul GCD
  2. Utilizzando Code di operazioni vedrai la vera potenza delle operazioni, invece di avviare l’operazione da solo , la dai alla coda di operazioni, quindi gestisci la pianificazione e l’esecuzione.
  3. Le code di operazioni sono un modo orientato agli oggetti per incapsulare il lavoro che si desidera eseguire in modo asincrono.
  4. Si aggiunge operations (attività/lavoro) su operation queue e abbiamo discusso di come possiamo creare operazioni utilizzando due metodi.

Aggiungi operazioni

Come mostrato in Figura 4 abbiamo creato due operazioni (usando il blocco) e le abbiamo aggiunte alla coda delle operazioni. Operation queue ha avviato entrambe le operazioni su un thread in background e le ha eseguite. Non è necessario chiamare il metodo start() sul thread personalizzato 🆒. Quando aggiungiamo operazione l’operazione in coda eseguito non appena è pronto

Figura 4

Come mostrato in Figura 5 abbiamo appena eseguito compito in modo seriale o si può dire che abbiamo implementato di serie coda mediante Operazione di Code, si prega di fare riferimento alla mia parte 1 se non sai cosa è di serie coda di impostazione maxConcurrentOperationCount = 1

maxConcurrentOperationCount →Il numero massimo di coda operazioni che è possibile eseguire allo stesso tempo. Il valore di default è -1, il che significa che il sistema a decidere

Figura 5

impostando maxConcurrentOperationCount = 2 abbiamo fatto un concorrente di coda e ora le attività sono in esecuzione contemporaneamente, come mostrato in Figura 6

Figura 6

le Operazioni di Dipendenze

, Come mostrato in Figura 7, abbiamo creato una serie di coda aggiungendo dipendenze tra le due attività. Abbiamo creato due operazioni su blocchi e stiamo dicendo che non inizio attività 1 fino task 2 è finito chiamando blockOperations1.addDependency(blockOperations2)

Figura 7

La spedizione del Gruppo di Attuazione Mediante Operazioni di Coda

parte 2 abbiamo utilizzato GCD spedizione di gruppo per bloccare un thread fino a quando uno o più compiti terminato l’esecuzione. Come mostrato in Figura 8 abbiamo implementato lo stesso comportamento utilizzando le code di operazioni utilizzando le dipendenze. Questo è molto utile se non è possibile fare progressi fino a quando tutte le attività specificate sono state completate.

, Come mostrato in Figura 8 sono tre i compiti e abbiamo voluto eseguire contemporaneamente e quando tutti i compiti finiti, abbiamo bisogno di chiamare un metodo per indicare che tutte le attività è terminata e che cosa abbiamo fatto

  1. Creato una operazione di coda
  2. Creato tre bloccare le operazioni che verranno eseguite le attività
  3. Creato un completamento operazioni di blocco (blockOperations4) che si innescano quando tutti e tre i compiti finito
  4. Fatto blockOperations4 dipende blockOperations1, blockOperations2 e blockOperations3 il che significa che blockOperations4 eseguirà quando tutti e tre i compiti finiti
  5. waitUntilFinished → Blocca l’esecuzione del thread corrente fino a che l’operazione oggetto terminato il suo compito, perché non si desidera bloccare il thread corrente, che è il principale vengono assegnate con false
  6. Esegui questo codice e “Tutta l’Operazione è stata Completata” stampa quando task1, task2 e task3 sarà finito

Figura 8

Come mostrato in Figura 9 si limita a bloccare il thread principale impostando waitUntilFinished = true. Quindi la domanda è: quando è utile e si otterrà la risposta nella prossima sezione

Figura 9

Come mostrato in Figura 10 abbiamo implementato un comportamento di gruppo di spedizione utilizzando la coda di operazioni senza utilizzare alcuna dipendenza ciò che abbiamo fatto abbiamo usato la funzionalità waitUntilFinished in modo appropriato . Se sei su thread in background puoi bloccare questo thread per ottenere questo comportamento. Ho volutamente acceso al thread in background utilizzando DispatchQueue.global().async metodo di vedere la parte 1 di capire questo codice

Abbiamo detto che l’operazione di coda di eseguire attività 1 attività 2 e 3 attività in funzionamento coda e bloccare il thread corrente fino a quando queste attività simultanee a finire la loro esecuzione

Figura 10

Vantaggi di gestione Code di Oltre GCD

  1. L’Operazione API fornisce il supporto per le dipendenze. È possibile creare dipendenze complesse tra le attività molto facilmente anche se in GCD è possibile ottenerlo ma è necessario fare molto lavoro.
  2. Le classi NSOperation e NSOperationQueue hanno un numero di proprietà che possono essere osservate, utilizzando KVO (Key Value Observing). Questo è un altro vantaggio importante se si desidera monitorare lo stato di un’operazione o di una coda di operazioni.
  3. Le operazioni possono essere messe in pausa, riprese e annullate. Una volta che si invia un’attività utilizzando Grand Central Dispatch, non si ha più il controllo o la comprensione dell’esecuzione di tale attività. L’API NSOperation è più flessibile in questo senso, dando allo sviluppatore il controllo sul ciclo di vita dell’operazione
  4. NSOperationQueue aggiunge anche una serie di vantaggi al mix. Ad esempio, è possibile specificare il numero massimo di operazioni in coda che possono essere eseguite contemporaneamente. Ciò semplifica il controllo del numero di operazioni eseguite contemporaneamente o la creazione di una coda di operazioni seriali.

In arrivo

Nella prossima parte, esamineremo il caso d’uso effettivo della creazione di un’operazione personalizzata

Link utili

· https://developer.apple.com/library/archive/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationObjects/OperationObjects.html#//apple_ref/doc/uid/TP40008091-CH101-SW1

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.