Comparación entre diferentes enfoques en swift 3.0
1. dormir
Este método no tiene una devolución de llamada. Poner códigos directamente después de esta línea para ejecutar en 4 segundos. Evitará que el usuario itere con elementos de la interfaz de usuario como el botón de prueba hasta que se acabe el tiempo. Aunque el botón se congela cuando se activa el sueño, otros elementos, como el indicador de actividad, siguen girando sin congelarse. No puede activar esta acción nuevamente durante el sueño.
sleep(4)
print("done")//Do stuff here
2. Despacho, realización y temporizador
Estos tres métodos funcionan de manera similar, todos se ejecutan en el subproceso de fondo con devoluciones de llamadas, solo con una sintaxis diferente y características ligeramente diferentes.
Dispatch se usa comúnmente para ejecutar algo en el hilo de fondo. Tiene la devolución de llamada como parte de la llamada de función
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(4), execute: {
print("done")
})
Realizar es en realidad un temporizador simplificado. Configura un temporizador con el retraso, y luego activa la función con el selector.
perform(#selector(callback), with: nil, afterDelay: 4.0)
func callback() {
print("done")
}}
Y finalmente, el temporizador también proporciona la capacidad de repetir la devolución de llamada, lo que no es útil en este caso
Timer.scheduledTimer(timeInterval: 4, target: self, selector: #selector(callback), userInfo: nil, repeats: false)
func callback() {
print("done")
}}
Para todos estos tres métodos, cuando hace clic en el botón para activarlos, la IU no se congelará y podrá volver a hacer clic en él. Si vuelve a hacer clic en el botón, se configura otro temporizador y la devolución de llamada se activará dos veces.
En conclusión
Ninguno de los cuatro métodos funciona lo suficientemente bien solo. sleep
desactivará la interacción del usuario, por lo que la pantalla se " congela " (en realidad no) y da como resultado una mala experiencia del usuario. Los otros tres métodos no congelarán la pantalla, pero puede activarlos varias veces, y la mayoría de las veces, desea esperar hasta que reciba la llamada antes de permitir que el usuario realice la llamada nuevamente.
Por lo tanto, un mejor diseño utilizará uno de los tres métodos asíncronos con bloqueo de pantalla. Cuando el usuario haga clic en el botón, cubra toda la pantalla con una vista translúcida con un indicador de actividad giratoria en la parte superior, que le indica al usuario que se está manejando el botón. Luego, elimine la vista y el indicador en la función de devolución de llamada, diciéndole al usuario que la acción se maneja correctamente, etc.