Last active
December 18, 2019 23:26
-
-
Save chavitos/0d1d15e4f58acd1f3f955bd535f65dd8 to your computer and use it in GitHub Desktop.
Playground usado no vídeo GCD 101! Caso o arquivo não abra diretamente do xcode (apple sendo apple haha) copie o conteúdo e cole em um playground seu! :D
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import UIKit | |
// GCD 101 \o/ | |
/* | |
GCD ou Grand Central Dispatch | |
API low-level que é utilizada para gerenciar a pool de threads | |
Utiliza de filas para a execução | |
MUITO bom no gerenciamento das threads | |
MARAVILHOSO | |
LINDO | |
SALVOU MINHA VIDA | |
Conceitos: | |
Processamento Paralelo vs Concorrente | |
- Concorrente: + de uma operação sendo executada | |
- Paralelo: é um tipo concorrente, + de uma operação ao mesmo tempo | |
Filas Concorrentes vs Serializadas | |
FIFO (first in first out) | |
Thread Safe! =D | |
Concorrentes: Permite o processamento concorrente (ah vá!) | |
Serializadas: Um processo por vez | |
Tipos fila | |
3 filas: | |
1 Main -> Responsável pela main threa e TUDO que é UI é feita nela (serializada) | |
2 Gloabais -> Filas, concorrentes, disponibilizadas pelo SO... Possui tipos de QoS (quality of service) que ajudam o GCD a executar a operação com a prioridade correta | |
3 Custom -> Filas que podem ser serealizadas ou concorrentes e no fim acabam sendo executadas em uma fila global | |
QoS: | |
Definem prioridade | |
.userInteractive -> Coisas com resposta rápida: Animações, UI updates geralmente são virtualmente instantâneas | |
.userInitiated -> Ações com respostas na ordem de segundos: Apertar um botão para abrir um doc e etc | |
.utility -> Indicado para operações de segundos a minutos: chamadas network, data feed | |
.background -> SO entende que deve focar na eficiência do uso da bateria: Sync com o server, backup | |
Completar a tabela | |
.default e .unspecified -> default é o default em caso de não haver QoS (geralmente esse cara cai na userInitiated ou utility) já o unspecified foi feito para APIs legadas que utilizam thread ao invés de QoS | |
Execução Síncrona (sync) vs Assíncrona (async) | |
sync: O sistema espera a execução da fila para continuar | |
async: O sistema NÃO espera a execução da fila para continuar | |
*/ | |
// HANDS ON! | |
//Filas | |
let main = DispatchQueue.main | |
let global = DispatchQueue.global() | |
let custom = DispatchQueue(label: "br.com.105devs.GCD101") | |
//Execução sync vs async | |
func syncTest() { | |
global.sync { | |
for taskA in 1...5 { | |
print("Task A:", taskA) | |
} | |
} | |
for taskB in 1...5 { | |
print("Task B:", taskB) | |
} | |
} | |
//syncTest() | |
func asyncTest() { | |
global.async { | |
for taskA in 1...5 { | |
print("Task A:", taskA) | |
} | |
} | |
for taskB in 1...5 { | |
print("Task B:", taskB) | |
} | |
} | |
//asyncTest() | |
/* | |
.userInteractive -> Coisas com resposta rápida: Animações, UI updates geralmente são virtualmente instantâneas | |
.userInitiated -> Ações com respostas na ordem de segundos: Apertar um botão para abrir um doc e etc | |
.utility -> Indicado para operações de segundos a minutos: chamadas network, data feed | |
.background -> SO entende que deve focar na eficiência do uso da bateria: Sync com o server, backup | |
*/ | |
let malhado = DispatchQueue(label: "vai.malhado", qos: .userInteractive, attributes: .concurrent) | |
let marrom = DispatchQueue(label: "vai.marrom", qos: .userInteractive, attributes: .concurrent) | |
func horseRacing() { | |
marrom.async { | |
for position in 1...10 { | |
print("Vai Marrom! \(position)") | |
} | |
} | |
malhado.async { | |
for position in 1...10 { | |
print("Vai Malhado! \(position)") | |
} | |
} | |
} | |
horseRacing() | |
// Deixa o like, se inscreva, indique pros 105 devs! |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment