在swift中取消AsyncTask的正确方法

时间:2017-07-10 19:29:51

标签: ios swift

我在DispatchQueue.main.async中使用UIViewController,我需要在解除UIViewController时取消异步任务

1 个答案:

答案 0 :(得分:3)

Grand Central Dispatch不允许在已经运行的情况下从外部取消任务。

如果您的视图控制器仍然存在,您基本上必须检查异步运行的任务。

假设您对GCD的调用直接在您的UIViewController中,那么self引用该视图控制器:

DispatchQueue.global().async { [weak self] in
    // Do work
    // Check if self still exists:
    guard let _ = self else {
        return // cancels the task
    }
    // Continue working
}

由于self只是对视图控制器的弱引用,因此它不会阻止视图控制器在被解除时被取消分配。当它被解除分配时,GCD块内的自我变为零,你知道你可以停止你的任务。

所以你只需要在异步块中检查self是否偶尔为nil。

注意:不要在主队列上执行长时间运行的任务,而是在全局队列甚至是专用队列中执行。使用主队列阻止主线程执行其他工作,如UI更新,以便您的应用程序冻结。