Swift中的延迟动作

时间:2014-11-23 02:35:48

标签: xcode swift delay

我想让活动指示器开始制作动画,然后在一秒后停止。

所以有人知道我该怎么做吗?

class stuff {
@IBOutlet weak var indicator: UIActivityIndicatorView!

   func iGotTriggeredBySomething {
      indicator.startAimating()
      //delay?
      indicator.stopAnimating()
   }
}

感谢您的回答。

4 个答案:

答案 0 :(得分:78)

dispatch_after()是延迟行动的标准方式。

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

请参阅:dispatch_after - GCD in swift?


Swift 3.0更新

indicator.startAnimating()

let delay = Int(4.5 * Double(1000))
DispatchQueue.main.after(when: .now() + .milliseconds(delay)) {
    indicator.stopAnimating()
}

但是,根据Swift 3.0的精神,我认为扩展DispatchQueue将是一个更好的解决方案。

extension DispatchQueue {
    func delay(_ timeInterval: TimeInterval, execute work: () -> Void) {
        let milliseconds = Int(timeInterval * Double(1000))
        after(when: .now() + .milliseconds(milliseconds), execute: work)
    }
}

这给我们留下了非常好的

indicator.startAnimating()

DispatchQueue.main.delay(4.5) {
    indicator.stopAnimating()
}

更新2

深入研究Xcode 8.0测试版,我找到了public func +(time: DispatchTime, seconds: Double) -> DispatchTime。所以,我想这是有效的......

indicator.startAnimating()

DispatchQueue.main.after(when: .now() + 4.5) {
    indicator.stopAnimating()
}

我不认为有必要延长DispatchQueue这个干净的东西。

-

Swift 3.1的更新

Swift 3.1有新的语法。他们只是喜欢改变他们的事情。

indicator.startAnimating()

DispatchQueue.main.asyncAfter(deadline: .now() + 4.5) {
    indicator.stopAnimating()
}

答案 1 :(得分:9)

使用 Swift 3.1 和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()
}

此时也可以使用.seconds(Int).microseconds(Int).nanoseconds(Int)

答案 2 :(得分:9)

使用更新的Swift 3语法,这将成为

DispatchQueue.main.asyncAfter(deadline: .now() + 4.5) {
    indicator.stopAnimating()
}

答案 3 :(得分:3)

iOS 10中的新功能,Timer has a block initializer在主线程上执行。它也稍微灵活一点,因为您可以参考Timer并取消它或在事后重新安排它。

    let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: false) {_ in 
    }