web-dev-qa-db-ja.com

Swiftの遅延アクション

アクティビティインジケータのアニメーションを開始し、1秒後に停止したい。

だから誰も私がそれを行う方法を知っていますか?

class stuff {
@IBOutlet weak var indicator: UIActivityIndicatorView!

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

回答ありがとうございます。

29
user4001326

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()
}
_
79
Jeffery Thomas

更新されたSwift 3構文では、これは

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

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)を時間に使用できます。

9

IOS 10の新機能 タイマーにはブロック初期化子があります メインスレッドで実行されます。また、タイマーへの参照を取得してキャンセルしたり、事後に再スケジュールしたりできるため、わずかに柔軟性があります。

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