構文は単純です:
// to run something in 0.1 seconds
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
// your code here
}
注、追加の上記の構文seconds
としてDouble
(我々はナノ秒加えることに慣れたESPので)混乱の源であるように思われます。その「秒を追加するDouble
」構文deadline
はaでDispatchTime
あり、舞台裏でa +
を取り、Double
その秒数をに追加する演算子がありますDispatchTime
。
public func +(time: DispatchTime, seconds: Double) -> DispatchTime
ただし、本当にmsec、μs、またはnsecの整数をに追加したい場合はDispatchTime
、a 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
ディスパッチされたタスクをキャンセルする方法について尋ねられました。これを行うには、を使用しますDispatchWorkItem
。たとえば、これは5秒で起動するタスクを開始します。または、ビューコントローラーが閉じられて割り当てが解除されるとdeinit
、タスクをキャンセルします。
class ViewController: UIViewController {
private var item: DispatchWorkItem?
override func viewDidLoad() {
super.viewDidLoad()
item = DispatchWorkItem { [weak self] in
self?.doSomething()
self?.item = nil
}
DispatchQueue.main.asyncAfter(deadline: .now() + 5, execute: item!)
}
deinit {
item?.cancel()
}
func doSomething() { ... }
}
での[weak self]
キャプチャリストの使用に注意してくださいDispatchWorkItem
。これは、強い参照サイクルを回避するために不可欠です。また、これによりプリエンプティブなキャンセルは行われず、タスクがまだ開始されていない場合は、タスクの開始が停止されるだけであることに注意してください。ただし、cancel()
呼び出しに遭遇するまでにすでに開始している場合、ブロックはその実行を終了します(isCancelled
ブロック内を手動でチェックしている場合を除く)。