はじめに
時間差で処理を実行したい場合に使うasyncAfter
の処理を、何らかのアクションでキャンセルしたい場合の方法を紹介します。
コード
Extension.swift
extension DispatchQueue {
func cancelableAsyncAfter(deadline: DispatchTime, execute: @escaping () -> Void) -> DispatchWorkItem {
let item = DispatchWorkItem(block: execute)
asyncAfter(deadline: deadline, execute: item)
return item
}
}
DispatchWorkItem
を返す関数をextensionに追加します。
ViewController.swift
final class ViewController: UIViewController {
private var item: DispatchWorkItem?
// 省略
func hoge() {
item = DispatchQueue.main.cancelableAsyncAfter(deadline: .now() + 5.0, execute: {
// 何らかの処理
})
}
func fuga() {
if let item = item {
item.cancel()
}
}
}
classで保持しているDispatchWorkItem
のインスタンスにextensionで追加したcancelableAsyncAfter
の返り値を代入します。
asyncAfter
をキャンセルしたい箇所でfuga()
を実行してあげるとキャンセルすることができます。
ちなみに、遅延処理を実行する前はキャンセルすることはできますが、処理が実行された状態で中断することはできないようです。