Swift 2では、dispatch_after
を使ってグランドセントラルディスパッチを使ってアクションを遅らせることができました。
var dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC)))
dispatch_after(dispatchTime, dispatch_get_main_queue(), {
// your function here
})
しかし、これはもうSwift 3以降ではコンパイルされていないようです。これを現代のSwiftで書くための好ましい方法は何ですか?
構文は簡単です:
// to run something in 0.1 seconds
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
// your code here
}
seconds
としてDouble
を追加する上記の構文は混乱の元と思われます(特にnsecの追加に慣れていたので)。 Double
はdeadline
なので、「秒をDispatchTime
として追加」という構文が機能します。そして、舞台裏では、Double
を取り、DispatchTime
にその秒数を追加する+
演算子があります。
public func +(time: DispatchTime, seconds: Double) -> DispatchTime
しかし、DispatchTime
に整数のmsec、μs、またはnsecを追加したい場合は、DispatchTimeInterval
にDispatchTime
を追加することもできます。それはあなたができることを意味します:
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(500)) {
os_log("500 msec seconds later")
}
DispatchQueue.main.asyncAfter(deadline: .now() + .microseconds(1_000_000)) {
os_log("1m μs seconds later")
}
DispatchQueue.main.asyncAfter(deadline: .now() + .nanoseconds(1_500_000_000)) {
os_log("1.5b nsec seconds later")
}
これらはすべてDispatchTime
クラスの+
演算子に対するこの個別のオーバーロードメソッドのためにシームレスに機能します。
public func +(time: DispatchTime, interval: DispatchTimeInterval) -> DispatchTime
スイフト4:
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) {
// Code
}
当分の間、.seconds(Int)
、.microseconds(Int)
、および.nanoseconds(Int)
も使用できます。
あなただけの遅延機能が必要な場合
スイフト4
func delay(delay: Double, closure: @escaping () -> ()) {
DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
closure()
}
}
あなたはそれを使うことができます:
delay(delay: 1) {
print("Hi!")
}
swift 3のリリース後、@エスケープも追加する必要があります
func delay(_ delay: Double, closure: @escaping () -> ()) {
DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
closure()
}
}
スイフト4
あなたはDispatchQueueで拡張を作成して、内部でDispatchQueue
asyncAfter関数を使う関数遅延を加えることができます
extension DispatchQueue {
static func delay(_ delay: DispatchTimeInterval, closure: @escaping () -> ()) {
DispatchQueue.main.asyncAfter(deadline: .now() + delay, execute: closure)
}
}
そして使う
DispatchQueue.delay(.milliseconds(10)) {
print("task to be done")
}
受け入れられた答えのやや異なる味。
スイフト4
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1 + .milliseconds(500) +
.microseconds(500) + .nanoseconds(1000)) {
print("Delayed by 0.1 second + 500 milliseconds + 500 microseconds +
1000 nanoseconds)")
}
DispatchQueue.main.after(when: DispatchTime, execute: () -> Void)
を呼び出す
Xcodeツールを使用してSwift 3に変換することを強くお勧めします(編集>変換>現在のSwift構文へ)。それは私のためにこれを捕まえました
Swift 5以上
DispatchQueue.main.asyncAfter(deadline: .now() + 2, execute: {
// code to execute
})
Swift 4.1とXcode 9.4.1の場合
簡単な答えは….
//To call function after 5 seconds time
DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) {
//Here call your function
}
あなたが使用することができます
DispatchQueue.main.asyncAfter(deadline: .now() + .microseconds(100)) {
// Code
}
これを試して
let when = DispatchTime.now() + 1.5
DispatchQueue.main.asyncAfter(deadline: when) {
//some code
}
これは私にとってSwift 3でうまくいった
let time1 = 8.23
let time2 = 3.42
// Delay 2 seconds
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
print("Sum of times: \(time1 + time2)")
}
答えのどれも非メインスレッドで実行することを述べなかった、従って私の2セントを加えなさい。
メインキュー (メインスレッド)
let mainQueue = DispatchQueue.main
let deadline = DispatchTime.now() + .seconds(10)
mainQueue.asyncAfter(deadline: deadline) {
// ...
}
OR
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + .seconds(10)) {
// ...
}
グローバルキュー (非メインスレッド、指定されたQOSに基づく)
let backgroundQueue = DispatchQueue.global()
let deadline = DispatchTime.now() + .milliseconds(100)
backgroundQueue.asyncAfter(deadline: deadline, qos: .background) {
// ...
}
OR
DispatchQueue.global().asyncAfter(deadline: DispatchTime.now() + .milliseconds(100), qos: .background) {
// ...
}