xcode - pause - Acciones de retraso en Swift
swift pause time (4)
Quiero hacer que un indicador de actividad comience a animarse y luego se detenga después de un segundo.
Entonces, ¿alguien sabe cómo podría hacer eso?
class stuff {
@IBOutlet weak var indicator: UIActivityIndicatorView!
func iGotTriggeredBySomething {
indicator.startAimating()
//delay?
indicator.stopAnimating()
}
}
Gracias por responder.
Aquí hay un código más limpio y expresivo para hacer esto usando Swift 3.1 y Grand Central Dispatch:
Swift 3.1:
indicator.startAnimating()
// Runs after 1 second on the main queue.
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1) ) {
indicator.stopAnimating()
}
También se pueden .seconds(Int)
, .microseconds(Int)
y .nanoseconds(Int)
para el tiempo.
Con la sintaxis Swift 3 actualizada esto se convierte en
DispatchQueue.main.asyncAfter(deadline: .now() + 4.5) {
indicator.stopAnimating()
}
Nuevo en iOS 10, Timer tiene un inicializador de bloque que se ejecuta en el hilo principal. También es un poco más flexible porque puede tomar una referencia al temporizador y cancelarlo o reprogramarlo después del hecho.
let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: false) {_ in
}
dispatch_after()
es la forma estándar de retrasar acciones.
indicator.startAnimating()
let delay = 4.5 * Double(NSEC_PER_SEC)
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
dispatch_after(time, dispatch_get_main_queue()) {
indicator.stopAnimating()
}
Ver: dispatch_after - GCD en swift?
Actualización para Swift 3.0
indicator.startAnimating()
let delay = Int(4.5 * Double(1000))
DispatchQueue.main.after(when: .now() + .milliseconds(delay)) {
indicator.stopAnimating()
}
Sin embargo, en el espíritu de Swift 3.0, creo que extender DispatchQueue
sería una mejor solución.
extension DispatchQueue {
func delay(_ timeInterval: TimeInterval, execute work: () -> Void) {
let milliseconds = Int(timeInterval * Double(1000))
after(when: .now() + .milliseconds(milliseconds), execute: work)
}
}
Esto nos deja con una muy buena.
indicator.startAnimating()
DispatchQueue.main.delay(4.5) {
indicator.stopAnimating()
}
Actualización 2
Excavando en el beta de Xcode 8.0, encontré public func +(time: DispatchTime, seconds: Double) -> DispatchTime
. Entonces, supongo que esto es válido ...
indicator.startAnimating()
DispatchQueue.main.after(when: .now() + 4.5) {
indicator.stopAnimating()
}
No creo que sea necesario extender DispatchQueue
para algo que ya esté limpio.
-
Actualización para Swift 3.1
Hay una nueva sintaxis para Swift 3.1. Simplemente les gusta cambiar las cosas, no ellos.
indicator.startAnimating()
DispatchQueue.main.asyncAfter(deadline: .now() + 4.5) {
indicator.stopAnimating()
}