在 Swift 中延迟操作



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

那么有谁知道我该怎么做?

class stuff {
@IBOutlet weak var indicator: UIActivityIndicatorView!
   func iGotTriggeredBySomething {
      indicator.startAimating()
      //delay?
      indicator.stopAnimating()
   }
}

感谢您的回答。

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?


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

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

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

下面是一个使用 Swift 3.1 和 Grand Central Dispatch 执行此操作的更简洁、更具表现力的代码:

斯威夫特 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)也可以同时使用。

iOS

10 中的新功能,计时器具有在主线程上执行的块初始值设定项。 它也稍微灵活一些,因为您可以引用计时器并在事后取消它或重新安排它。

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

最新更新