我在DispatchQueue.main.async
中使用UIViewController
,我需要在解除UIViewController
时取消异步任务
答案 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更新,以便您的应用程序冻结。