LoginSignup
3

posted at

Organization

[Swift]遅延処理(asyncAfter)をキャンセルする

はじめに

時間差で処理を実行したい場合に使う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()を実行してあげるとキャンセルすることができます。

ちなみに、遅延処理を実行する前はキャンセルすることはできますが、処理が実行された状態で中断することはできないようです。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
3