No Swift 2, consegui criar fila com o seguinte código:
let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT)
Mas isso não é compilado no Swift 3.
Qual é a maneira preferida de escrever isso no Swift 3?
ios
swift3
xcode8
grand-central-dispatch
dispatch-after
Karthik Kumar
fonte
fonte
DispatchQueue(label: "your-label")
para uma fila serial. Todos os parâmetros extras têm valores padrão.Respostas:
Criando uma fila simultânea
Crie uma fila serial
Obter fila principal de forma assíncrona
Obter fila principal de forma síncrona
Para obter um dos threads em segundo plano
Xcode 8.2 beta 2:
Para obter um dos threads em segundo plano
Se você quiser aprender sobre o uso dessas filas, consulte esta resposta
fonte
attributes: .serial
ao criar uma fila de série:let serialQueue = DispatchQueue(label: "queuename")
.Compila em> = Swift 3 . Este exemplo contém a maior parte da sintaxe que precisamos.
QoS - nova sintaxe de qualidade de serviço
weak self
- interromper ciclos de retençãose o eu não estiver disponível, não faça nada
async global utility queue
- para consulta de rede, não espera o resultado, é uma fila simultânea, o bloco (geralmente) não espera quando iniciado. A exceção para uma fila simultânea pode ser que, quando seu limite de tarefas foi atingido anteriormente, a fila se transforma temporariamente em uma fila serial e aguarda até que alguma tarefa anterior nessa fila seja concluída.async main queue
- para tocar na interface do usuário, o bloco não espera o resultado, mas espera pelo slot no início. A fila principal é uma fila serial.Obviamente, você precisa adicionar alguma verificação de erro a isso ...
fonte
guard
queself
não énil
no topo, de modo que nenhum do código é executado se fornil
, por exemplo,guard strongSelf = self else { return }
..global(qos: .background)
para E / S (solicitação de rede). Use.global(qos: .default)
ou em.global(qos: .utility)
vez disso.Compilado no XCode 8, Swift 3 https://github.com/rpthomas/Jedisware
fonte
Como a pergunta do OP já foi respondida acima, só quero adicionar algumas considerações de velocidade:
Faz muita diferença qual classe de prioridade você atribui à sua função assíncrona em DispatchQueue.global .
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 baixo consumo de 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
Fiz isso e isso é especialmente importante se você deseja atualizar sua interface do usuário para mostrar novos dados sem que o usuário perceba, como no UITableView ou no UIPickerView.
fonte
// use a Fila de operação se precisar preencher os objetos (rótulos, visualização de imagem, visualização de texto) no seu controlador de exibição
fonte
Eu refiz seu código no Xcode 8, Swift 3 e as alterações são marcadas em contraste com a sua versão do Swift 2.
fonte
Swift 3
Se você deseja encerrar o código rapidamente, deseja alterar o storyboard. Qualquer tipo de alteração pertence à visualização do aplicativo.
mas você deseja usar o método de despacho, seu aplicativo não falhará
método assíncrono
método de sincronização
fonte
DispatchQueue.main.sync
Fila serial:
Fila simultânea:
fonte
Para Swift 3
fonte
fonte
Atualização para o swift 5
Da documentação da Apple :
Parâmetros
rótulo
Um rótulo de cadeia para anexar à fila para identificá-lo exclusivamente em ferramentas de depuração, como Instrumentos, amostra, stackshots e relatórios de falha. Como aplicativos, bibliotecas e estruturas podem criar suas próprias filas de despacho, um estilo de nomeação de DNS reverso (com.example.myqueue) é recomendado. Este parâmetro é opcional e pode ser NULL.
qos
O nível de qualidade de serviço a ser associado à fila. Este valor determina a prioridade na qual o sistema agenda tarefas para execução. Para obter uma lista dos valores possíveis, consulte DispatchQoS.QoSClass.
atributos
Os atributos a serem associados à fila. Inclua o atributo simultâneo para criar uma fila de expedição que execute tarefas simultaneamente. Se você omitir esse atributo, a fila de expedição executará tarefas em série.
autoreleaseFrequency
A frequência com a qual liberar automaticamente objetos criados pelos blocos agendados pela fila. Para obter uma lista de valores possíveis, consulte DispatchQueue.AutoreleaseFrequency .
alvo
A fila de destino na qual executar blocos. Especifique DISPATCH_TARGET_QUEUE_DEFAULT se desejar que o sistema forneça uma fila apropriada para o objeto atual.
fonte
agora é simplesmente:
o padrão é serial, para ser simultâneo, use o argumento de atributos opcionais .concurrent
fonte
seiralQueue.async {}
. @tylemolfonte
Você pode criar fila de expedição usando esse código no swift 3.0
fonte