Comparaison entre différentes approches dans swift 3.0
1. Dormir
Cette méthode n'a pas de rappel. Mettez les codes directement après cette ligne pour les exécuter en 4 secondes. Il empêchera l'utilisateur d'itérer avec des éléments d'interface utilisateur comme le bouton de test jusqu'à ce que le temps soit écoulé. Bien que le bouton soit gelé lorsque le sommeil entre en action, d'autres éléments comme l'indicateur d'activité tournent toujours sans geler. Vous ne pouvez plus déclencher cette action pendant le sommeil.
sleep(4)
print("done")//Do stuff here
2. Envoi, exécution et minuterie
Ces trois méthodes fonctionnent de manière similaire, elles s'exécutent toutes sur le thread d'arrière-plan avec des rappels, juste avec une syntaxe différente et des fonctionnalités légèrement différentes.
La répartition est couramment utilisée pour exécuter quelque chose sur le thread d'arrière-plan. Il a le rappel dans le cadre de l'appel de fonction
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(4), execute: {
print("done")
})
Perform est en fait une minuterie simplifiée. Il met en place une minuterie avec le retard, puis déclenche la fonction par sélecteur.
perform(#selector(callback), with: nil, afterDelay: 4.0)
func callback() {
print("done")
}}
Et enfin, le minuteur permet également de répéter le rappel, ce qui n'est pas utile dans ce cas
Timer.scheduledTimer(timeInterval: 4, target: self, selector: #selector(callback), userInfo: nil, repeats: false)
func callback() {
print("done")
}}
Pour ces trois méthodes, lorsque vous cliquez sur le bouton pour les déclencher, l'interface utilisateur ne se fige pas et vous êtes autorisé à cliquer à nouveau dessus. Si vous cliquez à nouveau sur le bouton, une autre minuterie est configurée et le rappel sera déclenché deux fois.
En conclusion
Aucune des quatre méthodes ne fonctionne assez bien seule. sleep
désactivera l'interaction avec l'utilisateur, de sorte que l'écran "se fige " (pas réellement) et entraîne une mauvaise expérience utilisateur. Les trois autres méthodes ne gèleront pas l'écran, mais vous pouvez les déclencher plusieurs fois, et la plupart du temps, vous voulez attendre que vous récupériez l'appel avant de permettre à l'utilisateur de refaire l'appel.
Ainsi, une meilleure conception utilisera l'une des trois méthodes asynchrones avec blocage d'écran. Lorsque l'utilisateur clique sur le bouton, couvrez tout l'écran avec une vue translucide avec un indicateur d'activité de rotation sur le dessus, indiquant à l'utilisateur que le clic sur le bouton est en cours de traitement. Ensuite, supprimez la vue et l'indicateur dans la fonction de rappel, indiquant à l'utilisateur que l'action est correctement gérée, etc.