Skip to content

Instantly share code, notes, and snippets.

@chavitos
Last active December 18, 2019 23:26
Show Gist options
  • Save chavitos/0d1d15e4f58acd1f3f955bd535f65dd8 to your computer and use it in GitHub Desktop.
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
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