Como usar o threading no swift?
dispatchOnMainThread:^{
NSLog(@"Block Executed On %s", dispatch_queue_get_label(dispatch_get_current_queue()));
}];
ios
swift
multithreading
dispatch-queue
Anshul
fonte
fonte
]
antes do ponto e vírgula na última linha?DispatchQueue.global(qos: .background).async { print("Run on background thread") DispatchQueue.main.async { print("We finished that.") // only back on the main thread, may you access UI: label.text = "Done." } }
Respostas:
Swift 3.0+
Muito foi modernizado no Swift 3.0. A execução de algo no segmento de plano de fundo se parece com o seguinte:
Swift 1.2 a 2.3
Pre Swift 1.2 - Problema conhecido
A partir do Swift 1.1, a Apple não suportava a sintaxe acima sem algumas modificações. Passar
QOS_CLASS_BACKGROUND
realmente não funcionou; em vez disso, useInt(QOS_CLASS_BACKGROUND.value)
.Para obter mais informações, consulte a documentação da Apple.
fonte
Async.background {}
A melhor prática é definir uma função reutilizável que possa ser acessada várias vezes.
FUNÇÃO REUTILIZÁVEL:
por exemplo, em algum lugar como AppDelegate.swift como uma função global.
Nota: em Swift 2.0, substituir QOS_CLASS_USER_INITIATED.value acima com QOS_CLASS_USER_INITIATED.rawValue vez
USO:
A. Para executar um processo em segundo plano com um atraso de 3 segundos:
B. Para executar um processo em segundo plano, execute uma conclusão em primeiro plano:
C. Atraso em 3 segundos - observe o uso do parâmetro de conclusão sem o parâmetro de segundo plano:
fonte
if(background != nil){ background!(); }
combackground?()
uma sintaxe um pouco swiftier?DispatchQueue.global(priority: Int(DispatchQoS.QoSClass.userInitiated.rawValue)).async {
mas isso gera um erro comocannot invoke initializer for type 'Int' with an argument list of type '(qos_class_t)'
. Uma solução de trabalho é encontrada aqui (DispatchQueue.global(qos: DispatchQoS.QoSClass.userInitiated).async
).A resposta de Dan Beaulieu no swift5 (também trabalhando desde o swift 3.0.1).
Swift 5.0.1
Uso
fonte
background
encerramento seja muito, muito, muito longo (~ = infinito). Esse método é feito para durar um tempo finito: o tempo que seu trabalho em segundo plano precisa executar. Portanto, ocompletion
fechamento será chamado assim que o tempo de execução do trabalho em segundo plano + o atraso passar.Versão Swift 3
O Swift 3 utiliza nova
DispatchQueue
classe para gerenciar filas e threads. Para executar algo no thread de segundo plano, você usaria:Ou se você quiser algo em duas linhas de código:
Você também pode obter informações detalhadas sobre o GDC no Swift 3 neste tutorial .
fonte
Do tutorial de Jameson Quave
Swift 2
fonte
No Swift 4.2 e no Xcode 10.1
Temos três tipos de filas:
1. Fila principal: a fila principal é uma fila serial criada pelo sistema e associada ao encadeamento principal do aplicativo.
2. Fila Global: A fila global é uma fila simultânea que podemos solicitar com relação à prioridade das tarefas.
3. Filas personalizadas: podem ser criadas pelo usuário. As filas simultâneas personalizadas sempre são mapeadas para uma das filas globais, especificando uma propriedade de Qualidade de serviço (QoS).
Todas essas filas podem ser executadas de duas maneiras
1. Execução síncrona
2. Execução assíncrona
No AppCoda: https://www.appcoda.com/grand-central-dispatch/
fonte
.background
QoS ou.userInitiated
mas para mim funcionou com.background
Swift 4.x
Coloque isso em algum arquivo:
e depois chame onde precisar:
fonte
Você precisa separar as alterações que deseja executar em segundo plano das atualizações que deseja executar na interface do usuário:
fonte
dispatch_async(dispatch_get_main_queue()) { // update some UI }
É assim chamado quando a instrução background (Outer Block) é executada?Boas respostas, no entanto, de qualquer maneira, quero compartilhar minha solução Orientada a Objetos Atualizada para o Swift 5 .
confira: AsyncTask
Inspirado conceitualmente pelo AsyncTask do Android, escrevi minha própria aula no Swift
O AsyncTask permite o uso adequado e fácil do thread da interface do usuário. Essa classe permite executar operações em segundo plano e publicar resultados no thread da interface do usuário.
Aqui estão alguns exemplos de uso
Exemplo 1 -
Exemplo 2 -
Possui 2 tipos genéricos:
BGParam
- o tipo do parâmetro enviado para a tarefa após a execução.BGResult
- o tipo do resultado da computação em segundo plano.Ao criar um AsyncTask, você pode esses tipos para o que for necessário para passar e sair da tarefa em segundo plano, mas se você não precisar desses tipos, poderá marcá-lo como não utilizado, apenas configurando-o para:
Void
ou com sintaxe mais curta:()
Quando uma tarefa assíncrona é executada, ela realiza três etapas:
beforeTask:()->Void
chamado no thread da interface do usuário imediatamente antes da tarefa ser executada.backgroundTask: (param:BGParam)->BGResult
chamado no encadeamento em segundo plano imediatamente apósafterTask:(param:BGResult)->Void
chamado no encadeamento da interface do usuário com resultado da tarefa em segundo planofonte
Como a pergunta do OP já foi respondida acima, só quero adicionar algumas considerações de velocidade:
Não recomendo executar tarefas com a prioridade do encadeamento .background, especialmente no iPhone X, onde a tarefa parece estar alocada nos núcleos de baixa energia.
Aqui estão alguns dados reais de uma função computacionalmente intensiva que lê um arquivo XML (com buffer) e executa a interpolação de dados:
Nome do dispositivo / .background / .utility / .default / .userInitiated / .userInteractive
Observe que o conjunto de dados não é o mesmo para todos os dispositivos. É o maior do iPhone X e o menor do iPhone 5s.
fonte
Swift 5
Para facilitar, crie um arquivo "DispatchQueue + Extensions.swift" com este conteúdo:
Uso:
fonte
O Grand Central Dispatch é usado para lidar com multitarefa em nossos aplicativos para iOS.
Você pode usar este código
Mais informações usam este link: https://www.programminghub.us/2018/07/integrate-dispatcher-in-swift.html
fonte
Função multiuso para rosca
Use-o como:
fonte
Gosto muito da resposta de Dan Beaulieu, mas ela não funciona com o Swift 2.2 e acho que podemos evitar aqueles desagradáveis arranjos forçados!
fonte
fonte
no Swift 4.2, isso funciona.
fonte