Simultaneidade com o Grand Central Dispatch
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…





































![O que é uma lista vinculada, afinal? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)