Examinei o iBook da Apple e não consegui encontrar nenhuma definição dele:
Alguém pode explicar a estrutura de dispatch_after
?
dispatch_after(<#when: dispatch_time_t#>, <#queue: dispatch_queue_t?#>, <#block: dispatch_block_t?#>)
objective-c
swift
grand-central-dispatch
Kumar KL
fonte
fonte
Respostas:
Uma ideia mais clara da estrutura:
dispatch_time_t
é umUInt64
. Nadispatch_queue_t
verdade, o tipo é aliasizado a umNSObject
, mas você deve apenas usar seus métodos GCD familiares para obter filas. O bloco é um fechamento rápido. Especificamente,dispatch_block_t
é definido como() -> Void
, o que é equivalente a() -> ()
.Exemplo de uso:
EDITAR:
Eu recomendo usar a
delay
função realmente agradável de @ matt .EDIT 2:
No Swift 3, haverá novos wrappers para o GCD. Veja aqui: https://github.com/apple/swift-evolution/blob/master/proposals/0088-libdispatch-for-swift3.md
O exemplo original seria escrito da seguinte forma no Swift 3:
Observe que você pode escrever a
deadlineTime
declaração comoDispatchTime.now() + 1.0
e obter o mesmo resultado porque o+
operador é substituído da seguinte maneira (da mesma forma para-
):func +(time: DispatchTime, seconds: Double) -> DispatchTime
func +(time: DispatchWalltime, interval: DispatchTimeInterval) -> DispatchWalltime
Isso significa que, se você não usar o
DispatchTimeInterval
enum
e apenas escrever um número, presume-se que você esteja usando segundos.fonte
dispatch_after(1, dispatch_get_main_queue()) { println("test") }
1
emdispatch_after(1, ...
pode causar muita confusão aqui. As pessoas vão pensar que é um número de segundos, quando na verdade é nano-segundo . Sugiro ver a resposta de @brindy sobre como criar esse número corretamente.1
paradispatch_time(DISPATCH_TIME_NOW, Int64(1 * Double(NSEC_PER_SEC)))
porque leva a confusão. As pessoas podem pensar que você não precisa criar um dispatch_time_t no SwiftBinary operator '+' cannot be applied to operands of type DispatchTime and '_'
na linha #let delayTime = DispatchTime.now() + .seconds(1.0)
DispatchTime.now() + 1.0
parece ser a única maneira de fazê-lo funcionar (sem necessidade de.seconds
)Uso
dispatch_after
tantas vezes que escrevi uma função de utilitário de nível superior para simplificar a sintaxe:E agora você pode falar assim:
Uau, um idioma onde você pode melhorar o idioma. O que poderia ser melhor?
Atualização para Swift 3, Xcode 8 Seed 6
Parece que quase não vale a pena se preocupar, agora que eles melhoraram a sintaxe de chamada:
fonte
func delayInSec(delay: Double) -> dispatch_time_t { return dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC))) }
return
).1.0 ~~ { code...}
Swift 3+
Isso é super fácil e elegante no Swift 3+:
Resposta mais antiga:
Para expandir a resposta de Cezary, que será executada após 1 nanossegundo, tive que fazer o seguinte para executar após 4 segundos e meio.
Edit: Eu descobri que meu código original estava um pouco errado. A digitação implícita causa um erro de compilação se você não converter NSEC_PER_SEC em um Double.
Se alguém puder sugerir uma solução mais ideal, eu gostaria de ouvi-la.
fonte
dispatch_get_current_queue()
. Eu usei emdispatch_get_main_queue()
vez disso.dispatch_get_main_queue()
é definitivamente o que você deve usar. Atualizará.A sintaxe de matt é muito agradável e, se você precisar invalidar o bloco, poderá usar isso:
Use como segue
créditos
O link acima parece estar inoperante. Código Objc original do Github
fonte
performSelector:afterDelay:
agora está disponível no Swift 2, para que você possa cancelá-lo.dispatch_source_t
, porque isso é algo que você pode cancelar).Solução mais simples no Swift 3.0 e Swift 4.0 e Swift 5.0
Uso
fonte
A Apple possui um snippet de dispatch_after para o Objective-C :
Aqui está o mesmo trecho transportado para o Swift 3:
fonte
Outra maneira é estender o Double assim:
Então você pode usá-lo assim:
Eu gosto da função delay de matt, mas apenas por preferência, prefiro limitar o fechamento de passagens.
fonte
No Swift 3.0
Filas de expedição
Despacho após 5 segundos
fonte
Versão Swift 3.0
Após a função de fechamento, execute alguma tarefa após atraso no encadeamento principal.
Chame esta função como:
fonte
1) Adicione este método como parte da extensão UIViewController.
Chame este método no VC:
2)
3)
// Forma compacta
fonte
Embora não seja a pergunta original do OP, algumas
NSTimer
questões relacionadas foram marcadas como duplicatas dessa pergunta, portanto vale a pena incluir umaNSTimer
resposta aqui.NSTimer
vsdispatch_after
NSTimer
é mais alto nível, enquantodispatch_after
é mais baixo.NSTimer
é mais fácil cancelar. O cancelamentodispatch_after
requer a criação de mais código .Atrasando uma tarefa com
NSTimer
Crie uma
NSTimer
instância.Inicie o cronômetro com o atraso necessário.
Adicione uma função a ser chamada após o atraso (usando o nome que você usou para o
selector
parâmetro acima).Notas
timer.invalidate()
.repeats: true
.Se você tiver um evento único sem a necessidade de cancelar, não será necessário criar a
timer
variável de instância. O seguinte será suficiente:Veja minha resposta mais completa aqui .
fonte
Para várias funções, use isso. Isso é muito útil para usar animações ou carregador de atividades para funções estáticas ou qualquer atualização da interface do usuário.
Por exemplo - Use uma animação antes que um tableView seja recarregado. Ou qualquer outra atualização da interface do usuário após a animação.
fonte
Isso funcionou para mim.
Swift 3:
Objetivo-C:
fonte
Swift 3 e 4:
Você pode criar uma extensão no DispatchQueue e adicionar atraso de função que usa a função DispatchQueue asyncAfter internamente
usar:
fonte
Outro auxiliar para atrasar seu código que é 100% Swift em uso e, opcionalmente, permite escolher um encadeamento diferente para executar seu código atrasado em:
Agora você simplesmente adia seu código no thread principal assim:
Se você deseja atrasar seu código para um thread diferente :
Se você preferir um Framework que também tenha alguns recursos mais úteis, consulte o HandySwift . Você pode adicioná-lo ao seu projeto via Carthage e usá-lo exatamente como nos exemplos acima, por exemplo:
fonte
Eu sempre prefiro usar extensão em vez de funções gratuitas.
Swift 4
Use da seguinte maneira.
fonte
Atraso na chamada GCD usando asyncAfter in swift
Podemos atrasar como ** microssegundos , milissegundos , nanossegundos
fonte
Em Swift 4
Use este trecho:
fonte
A
dispatch_after(_:_:_:)
função usa três parâmetros:A
dispatch_after(_:_:_:)
função chama o bloco ou fechamento na fila de despacho que é passada para a função após um determinado atraso. Observe que o atraso é criado usando adispatch_time(_:_:)
função Lembre-se disso, porque também usamos essa função no Swift.Eu recomendo seguir o tutorial Raywenderlich Dispatch tutorial
fonte
No Swift 5, use o abaixo:
fonte
use esse código para executar alguma tarefa relacionada à interface do usuário após 2,0 segundos.
Versão Swift 3.0
Após a função de fechamento, execute alguma tarefa após atraso no encadeamento principal.
Chame esta função como:
fonte
Agora, mais do que o açúcar sintático para envios assíncronos no Grand Central Dispatch (GCD) em Swift.
adicionar Podfile
Então, você pode usá-lo assim.
fonte
O Swift 4 tem uma maneira bastante curta de fazer isso:
fonte
Aqui está a versão síncrona do asyncAfter no Swift:
Juntamente com o assíncrono:
fonte