Simultaneidade com o Grand Central Dispatch

Jan 24 2023
O que é GCD? O Grand Central Dispatch foi criado pela Apple há mais de 10 anos como uma abstração para ajudar os desenvolvedores a escrever código multiencadeado sem criar e gerenciar encadeamentos manualmente. Simultaneidade significa que duas tarefas podem ser iniciadas, executadas e concluídas em intervalos de tempo sobrepostos.

O que é GCD?

O Grand Central Dispatch foi criado pela Apple há mais de 10 anos como uma abstração para ajudar os desenvolvedores a escrever código multiencadeado sem criar e gerenciar encadeamentos manualmente.

Simultaneidade significa que duas tarefas podem ser iniciadas, executadas e concluídas em intervalos de tempo sobrepostos. Existem três maneiras de obter simultaneidade no iOS, threads, filas de despacho e filas de operação.

“Em vez de encadear diretamente, você usa o GCD para agendar tarefas de trabalho e o sistema as executa para você, aproveitando ao máximo seus recursos. O GCD assumirá a criação dos encadeamentos necessários e agendará suas tarefas nesses encadeamentos, transferindo o fardo do gerenciamento de encadeamentos do desenvolvedor para o sistema.”

A maior vantagem do GCD é que você não precisa pensar em recursos de hardware ao escrever seu código simultâneo.

“Todas as filas de despacho são estruturas de dados FIFO (primeiro a entrar, primeiro a sair), portanto, as tarefas são sempre iniciadas na mesma ordem em que são adicionadas.”

Existem basicamente três formas de simultaneidade no iOS:

  • tópicos
  • filas de despacho
  • filas de operação

“A desvantagem dos threads é que eles relegam o fardo de criar uma solução escalável para o desenvolvedor. Você precisa decidir quantos encadeamentos criar e ajustar esse número dinamicamente à medida que as condições mudam. Além disso, o aplicativo assume a maior parte dos custos associados à criação e manutenção dos threads que usa.”

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

“A DispatchQueueé uma camada de abstração no topo da fila GCD que permite executar tarefas de forma assíncrona e simultânea em seu aplicativo. As tarefas são sempre executadas na ordem em que são adicionadas à fila.”

Fila Serial e Fila Concorrente

“Uma Fila de Despacho serial executa apenas uma tarefa por vez. As filas seriais costumam ser usadas para sincronizar o acesso a um valor ou recurso específico para evitar a ocorrência de corridas de dados.”

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

“Uma fila de operação é o equivalente em Cocoa de uma fila de despacho concorrente e é implementada pela classe NSOperationQueue. Ao contrário das filas de despacho, as filas de operação não se limitam à execução de tarefas na ordem FIFO e suportam a criação de gráficos complexos de ordem de execução para suas tarefas.”

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

A fila de despacho principal é uma fila serial globalmente disponível que executa tarefas no thread principal do aplicativo.

“Você pode começar a fazer o trabalho pesado em uma fila em segundo plano e retornar à fila principal quando terminar.”

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

Feliz codificação…