No Swift 2, pude dispatch_after
adiar uma ação usando o Grand Central Dispatch:
var dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC)))
dispatch_after(dispatchTime, dispatch_get_main_queue(), {
// your function here
})
Mas isso não parece mais compilar desde o Swift 3. Qual é a maneira preferida de escrever isso no Swift moderno?
swift
swift4
grand-central-dispatch
swift5
brandonscript
fonte
fonte
UInt64
?Respostas:
A sintaxe é simplesmente:
Observe que a sintaxe acima de adicionar
seconds
como aDouble
parece ser uma fonte de confusão (especialmente porque estávamos acostumados a adicionar o nsec). ADouble
sintaxe "adicionar segundos como " funciona porquedeadline
é umDispatchTime
e, nos bastidores, há um+
operador que fará umDouble
e adicionará muitos segundos aoDispatchTime
:Mas, se você realmente deseja adicionar um número inteiro de ms, ms ou nsec ao
DispatchTime
, também pode adicionar umDispatchTimeInterval
a aDispatchTime
. Isso significa que você pode fazer:Tudo isso funciona perfeitamente por causa desse método de sobrecarga separado para o
+
operador daDispatchTime
classe.Foi perguntado como alguém cancela uma tarefa despachada. Para fazer isso, use
DispatchWorkItem
. Por exemplo, isso inicia uma tarefa que será acionada em cinco segundos ou, se o controlador de exibição for descartado e desalocado,deinit
cancelará a tarefa:Observe o uso da
[weak self]
lista de captura noDispatchWorkItem
. Isso é essencial para evitar um forte ciclo de referência. Observe também que isso não faz um cancelamento preventivo, mas apenas interrompe o início da tarefa, se ainda não o tiver feito. Mas se já tiver iniciado no momento em que encontrar acancel()
chamada, o bloco concluirá sua execução (a menos que você esteja verificando manualmenteisCancelled
dentro do bloco).fonte
DispatchTimeInterval
execuções, como.milliseconds
exigemInt
. Mas se apenas adicionando segundos, eu usariaDouble
, por exemplolet n: Double = 1.0; queue.asyncAfter(deadline: .now() + n) { ... }
.Swift 4:
Por enquanto
.seconds(Int)
,.microseconds(Int)
e.nanoseconds(Int)
também pode ser usado.fonte
.milliseconds
é melhor que o dobro.DispatchTimeInterval
valores de enumeração.case seconds(Int)
case milliseconds(Int)
case microseconds(Int)
case nanoseconds(Int)
.milliseconds is better than Double.
- Quero isso em uma camiseta;).Se você quer apenas a função de atraso em
Swift 4 e 5
Você pode usá-lo como:
fonte
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1, execute: closure)
é mais simples.após o lançamento do Swift 3, também é necessário adicionar o @escaping
fonte
Um sabor um pouco diferente da Resposta Aceita.
Swift 4
fonte
Swift 4
Você pode criar uma extensão no DispatchQueue e adicionar atraso de função que usa a
DispatchQueue
função asyncAfter internamenteE use
fonte
ligar
DispatchQueue.main.after(when: DispatchTime, execute: () -> Void)
Eu recomendo usar as ferramentas do Xcode para converter para o Swift 3 (Editar> Converter> na sintaxe do Swift atual). Pegou isso para mim
fonte
No Swift 4.1 e no Xcode 9.4.1
Resposta simples é ...
fonte
Swift 5 e acima
fonte
Nenhuma das respostas mencionou a execução em um segmento não principal, portanto, adicionei meus 2 centavos.
Na fila principal (encadeamento principal)
OU
Na fila global (encadeamento não principal, com base no QOS especificado).
OU
fonte
Isso funcionou para mim no Swift 3
fonte
Você pode usar
fonte
tente isso
fonte