Concomitanza con Grand Central Dispatch

Jan 24 2023
Cos'è GCD? Grand Central Dispatch è stato creato da Apple oltre 10 anni fa come astrazione per aiutare gli sviluppatori a scrivere codice multi-thread senza creare e gestire manualmente i thread. Concorrenza significa che due attività possono essere avviate, eseguite e completate in intervalli di tempo sovrapposti.

Cos'è GCD?

Grand Central Dispatch è stato creato da Apple oltre 10 anni fa come astrazione per aiutare gli sviluppatori a scrivere codice multi-thread senza creare e gestire manualmente i thread.

Concorrenza significa che due attività possono essere avviate, eseguite e completate in intervalli di tempo sovrapposti. Esistono tre modi per ottenere la concorrenza in iOS, thread, code di invio e code di operazioni.

“Invece di eseguire direttamente il threading, utilizzi GCD per programmare le attività lavorative e il sistema le eseguirà per te, sfruttando al massimo le sue risorse. GCD si occuperà della creazione dei thread richiesti e pianificherà le tue attività su questi thread, spostando l'onere della gestione dei thread dallo sviluppatore al sistema.

Il più grande vantaggio di GCD è che non devi pensare alle risorse hardware quando scrivi il tuo codice concorrente.

"Tutte le code di spedizione sono strutture di dati first-in, first-out (FIFO), quindi le attività vengono sempre avviate nello stesso ordine in cui vengono aggiunte."

Ci sono fondamentalmente tre modi di concorrenza in iOS:

  • fili
  • code di spedizione
  • code operative

“Lo svantaggio dei thread è che delegano allo sviluppatore l'onere di creare una soluzione scalabile. Devi decidere quanti thread creare e regolare quel numero in modo dinamico al variare delle condizioni. Inoltre, l'applicazione si assume la maggior parte dei costi associati alla creazione e alla manutenzione dei thread che utilizza.

NSThread* myThread = [[NSThread alloc] initWithTarget:self
                                       selector:@selector(myThreadMainMethod:)
                                       object:nil];
[myThread start];

"A DispatchQueueè un livello di astrazione in cima alla coda GCD che ti consente di eseguire attività in modo asincrono e contemporaneamente nella tua applicazione. Le attività vengono sempre eseguite nell'ordine in cui vengono aggiunte alla coda."

Coda seriale e coda simultanea

“Una coda di spedizione seriale esegue solo un'attività alla volta. Le code seriali vengono spesso utilizzate per sincronizzare l'accesso a un valore o una risorsa specifica per evitare che si verifichino corse di dati.

let serialQueue = DispatchQueue(label: "serialQueue")

serialQueue.async {
    print("Task 1 started")
    // Do some work..
    print("Task 1 finished")
}
serialQueue.async {
    print("Task 2 started")
    // Do some work..
    print("Task 2 finished")
}
Task 1 started
Task 1 finished
Task 2 started
Task 2 finished

let concurrentQueue = DispatchQueue(label: "concurrentQueue", 
                                    attributes: .concurrent)

concurrentQueue.async {
    print("Task 1 started")
    // Do some work..
    print("Task 1 finished")
}
concurrentQueue.async {
    print("Task 2 started")
    // Do some work..
    print("Task 2 finished")
}
Task 1 started
Task 2 started
Task 1 finished
Task 2 finished

“Una coda di operazione è l'equivalente Cocoa di una coda di spedizione simultanea ed è implementata dalla classe NSOperationQueue. A differenza delle code di spedizione, le code delle operazioni non si limitano all'esecuzione delle attività in ordine FIFO e supportano la creazione di complessi grafici dell'ordine di esecuzione per le tue attività.

NSOperationQueue* myQueue = [[NSOperationQueue alloc] init];
[myQueue addOperation:anOperation]; 
[myQueue addOperationWithBlock:^{
   /* Do something. */
}];

La coda di invio principale è una coda seriale disponibile a livello globale che esegue attività sul thread principale dell'applicazione.

"Puoi iniziare a fare il lavoro pesante su una coda in background e tornare alla coda principale quando hai finito."

DispatchQueue.main.async {
    self.tableView.reloadData()
}

Buona programmazione...