Comparação entre diferentes abordagens no swift 3.0
1. Dormir
Este método não tem uma chamada de retorno. Coloque os códigos diretamente após esta linha para serem executados em 4 segundos. Ele impedirá o usuário de iterar com elementos da interface do usuário, como o botão de teste, até que o tempo se esgote. Embora o botão esteja meio congelado quando o sono entra em ação, outros elementos, como o indicador de atividade, ainda estão girando sem congelar. Você não pode disparar esta ação novamente durante o sono.
sleep(4)
print("done")//Do stuff here
2. Despacho, Execução e Temporizador
Esses três métodos funcionam da mesma forma, todos eles estão sendo executados no encadeamento em segundo plano com retornos de chamada, apenas com sintaxe diferente e recursos ligeiramente diferentes.
O despacho é comumente usado para executar algo no encadeamento em segundo plano. Possui o retorno de chamada como parte da chamada de função
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(4), execute: {
print("done")
})
Perform é na verdade um timer simplificado. Ele configura um timer com o atraso e, em seguida, aciona a função pelo seletor.
perform(#selector(callback), with: nil, afterDelay: 4.0)
func callback() {
print("done")
}}
E, finalmente, o timer também oferece a capacidade de repetir o retorno de chamada, o que não é útil nesse caso
Timer.scheduledTimer(timeInterval: 4, target: self, selector: #selector(callback), userInfo: nil, repeats: false)
func callback() {
print("done")
}}
Para todos esses três métodos, quando você clicar no botão para acioná-los, a interface do usuário não congelará e você poderá clicar nele novamente. Se você clicar no botão novamente, outro temporizador será configurado e o retorno de chamada será acionado duas vezes.
Em conclusão
Nenhum dos quatro métodos funciona suficientemente bem por si só. sleep
desativará a interação do usuário, para que a tela " congele " (na verdade) e resulte em uma má experiência do usuário. Os outros três métodos não congelam a tela, mas você pode acioná-los várias vezes e, na maioria das vezes, deseja esperar até receber a chamada antes de permitir que o usuário faça a chamada novamente.
Portanto, um design melhor usará um dos três métodos assíncronos com bloqueio de tela. Quando o usuário clicar no botão, cubra a tela inteira com uma exibição translúcida com um indicador de atividade giratória na parte superior, informando ao usuário que o clique do botão está sendo manipulado. Em seguida, remova a visualização e o indicador na função de retorno de chamada, informando ao usuário que a ação foi tratada adequadamente etc.