LoginSignup
6
4

More than 1 year has passed since last update.

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

Posted at

はじめに

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

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

6
4
0

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
  3. You can use dark theme
What you can do with signing up
6
4