web-dev-qa-db-ja.com

Swift 3、4、5でdispatch_after GCDを書くにはどうすればいいですか?

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で書くための好ましい方法は何ですか?

412
brandonscript

構文は簡単です:

// to run something in 0.1 seconds

DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
    // your code here
}

secondsとしてDoubleを追加する上記の構文は混乱の元と思われます(特にnsecの追加に慣れていたので)。 Doubledeadlineなので、「秒をDispatchTimeとして追加」という構文が機能します。そして、舞台裏では、Doubleを取り、DispatchTimeにその秒数を追加する+演算子があります。

public func +(time: DispatchTime, seconds: Double) -> DispatchTime

しかし、DispatchTimeに整数のmsec、μs、またはnsecを追加したい場合は、DispatchTimeIntervalDispatchTimeを追加することもできます。それはあなたができることを意味します:

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
982
Rob

スイフト4:

DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) {
   // Code
}

当分の間、.seconds(Int).microseconds(Int)、および.nanoseconds(Int)も使用できます。

119

あなただけの遅延機能が必要な場合

スイフト4

func delay(delay: Double, closure: @escaping () -> ()) {

     DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
          closure()
     }
}

あなたはそれを使うことができます:

delay(delay: 1) { 
    print("Hi!")
}
52
rockdaswift

swift 3のリリース後、@エスケープも追加する必要があります

func delay(_ delay: Double, closure: @escaping () -> ()) {
  DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
    closure()
  }
}
16

スイフト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")
}
5
Suhit Patil

受け入れられた答えのやや異なる味。

スイフト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)")
 }
4

DispatchQueue.main.after(when: DispatchTime, execute: () -> Void)を呼び出す

Xcodeツールを使用してSwift 3に変換することを強くお勧めします(編集>変換>現在のSwift構文へ)。それは私のためにこれを捕まえました 

3
jjatie

Swift 5以上

DispatchQueue.main.asyncAfter(deadline: .now() + 2, execute: {
   // code to execute                 
})
1
midhun p

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
}
0
iOS

あなたが使用することができます

DispatchQueue.main.asyncAfter(deadline: .now() + .microseconds(100)) {
        // Code
    }
0
Parth Dhorda

これを試して

let when = DispatchTime.now() + 1.5
    DispatchQueue.main.asyncAfter(deadline: when) {
        //some code
    }
0
A.Guz

これは私にとって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)")
}
0
Ankit garg

答えのどれも非メインスレッドで実行することを述べなかった、従って私の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) {
    // ...
}
0
MANN