perform pause code after xcode swift delay

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() }