Nas versões anteriores do Swift, era possível criar um atraso com o seguinte código:
let time = dispatch_time(dispatch_time_t(DISPATCH_TIME_NOW), 4 * Int64(NSEC_PER_SEC))
dispatch_after(time, dispatch_get_main_queue()) {
//put your code which should be executed with a delay here
}
Mas agora, no Swift 3, o Xcode altera automaticamente 6 coisas diferentes, mas o seguinte erro aparece: "Não é possível converter DispatchTime.now
para o valor esperado dispatch_time_t
aka UInt64
".
Como se pode criar um atraso antes de executar uma sequência de código no Swift 3?
DispatchQueue.main.asyncAfter(deadline: when)
Eu gosto da notação de uma linha para o GCD, é mais elegante:
Além disso, no iOS 10, temos novos métodos de Timer, por exemplo, inicializador de bloco:
(a ação atrasada pode ser cancelada)
Lembre-se: por padrão, o timer é adicionado ao modo padrão de loop de execução. Isso significa que o cronômetro pode ser congelado quando o usuário está interagindo com a interface do usuário do seu aplicativo (por exemplo, ao rolar um UIScrollView) Você pode resolver esse problema adicionando o cronômetro ao modo de loop de execução específico:
Nesta postagem do blog, você pode encontrar mais detalhes.
fonte
Experimente a seguinte função implementada no Swift 3.0 e superior
Uso
fonte
Tente o código abaixo para atraso
fonte
Uma maneira é usar
DispatchQueue.main.asyncAfter
como muitas pessoas responderam.Outra maneira é usar
perform(_:with:afterDelay:)
. Mais detalhes aquifonte
// Executa a função após x segundos
//Usar:-
fonte