1. ホーム
  2. objective-c

[解決済み] dispatch_after - GCD in Swift?

2022-02-13 23:35:34

質問

を調べました。 iBook がAppleから提供されていますが、それに関する定義は見つかりませんでした。

の構造を説明できる人はいますか? dispatch_after ?

dispatch_after(<#when: dispatch_time_t#>, <#queue: dispatch_queue_t?#>, <#block: dispatch_block_t?#>)

解決方法は?

構造をより明確に

dispatch_after(when: dispatch_time_t, queue: dispatch_queue_t, block: dispatch_block_t?)

dispatch_time_tUInt64 . その dispatch_queue_t は、実は型エイリアスで NSObject しかし、キューを取得するためには、使い慣れた GCD メソッドを使用すればよいのです。ブロックはSwiftのクロージャです。具体的には dispatch_block_t は次のように定義されます。 () -> Void と等価である。 () -> () .

使用例です。

let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(1 * Double(NSEC_PER_SEC)))
dispatch_after(delayTime, dispatch_get_main_queue()) {
    print("test")
}

EDITです。

を使うことをお勧めします。 mattの素晴らしい delay 機能 .

EDIT 2:

Swift 3では、GCDの新しいラッパーが登場する予定です。こちらをご覧ください。 https://github.com/apple/swift-evolution/blob/master/proposals/0088-libdispatch-for-swift3.md

元の例をSwift 3で書くと以下のようになります。

let deadlineTime = DispatchTime.now() + .seconds(1)
DispatchQueue.main.asyncAfter(deadline: deadlineTime) {
    print("test")
}

なお deadlineTime として宣言します。 DispatchTime.now() + 1.0 となり、同じ結果になります。 + 演算子は次のようにオーバーライドされます(同様に - ):

  • func +(time: DispatchTime, seconds: Double) -> DispatchTime
  • func +(time: DispatchWalltime, interval: DispatchTimeInterval) -> DispatchWalltime

これは、もしあなたが DispatchTimeInterval enum で、数字だけを書くと、秒を使っているとみなされます。