Swift中的延迟动作

29 xcode delay swift

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

那么有谁知道我怎么能这样做?

class stuff {
@IBOutlet weak var indicator: UIActivityIndicatorView!

   func iGotTriggeredBySomething {
      indicator.startAimating()
      //delay?
      indicator.stopAnimating()
   }
}
Run Code Online (Sandbox Code Playgroud)

谢谢回答.

Jef*_*mas 80

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()
}
Run Code Online (Sandbox Code Playgroud)

请参阅:dispatch_after - swift中的GCD?


Swift 3.0的更新

indicator.startAnimating()

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

但是,根据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)
    }
}
Run Code Online (Sandbox Code Playgroud)

这让我们非常好

indicator.startAnimating()

DispatchQueue.main.delay(4.5) {
    indicator.stopAnimating()
}
Run Code Online (Sandbox Code Playgroud)

更新2

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

indicator.startAnimating()

DispatchQueue.main.after(when: .now() + 4.5) {
    indicator.stopAnimating()
}
Run Code Online (Sandbox Code Playgroud)

我不认为有必要扩展DispatchQueue这个干净的东西.

-

Swift 3.1的更新

Swift 3.1有新的语法.他们只是喜欢换东西而不是他们.

indicator.startAnimating()

DispatchQueue.main.asyncAfter(deadline: .now() + 4.5) {
    indicator.stopAnimating()
}
Run Code Online (Sandbox Code Playgroud)

  • @ zingle-dingle感谢您的注意:我更新了我的答案. (2认同)

小智 10

随着更新的Swift 3语法,这变成了

DispatchQueue.main.asyncAfter(deadline: .now() + 4.5) {
    indicator.stopAnimating()
}
Run Code Online (Sandbox Code Playgroud)


Han*_*son 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()
}
Run Code Online (Sandbox Code Playgroud)

此外.seconds(Int),.microseconds(Int).nanoseconds(Int)可用于时间.