2017-07-10 67 views
0

正確方法我用UIViewControllerDispatchQueue.main.async,我需要取消異步任務時解僱UIViewController到取消的AsyncTask在迅速

+1

[編輯]你的問題與一些相關的代碼,顯示你在'async'塊中實際做了什麼。 – rmaddy

回答

2

大中央調度不允許任務,從外部已經在運行時被取消。

如果您的視圖控制器仍然存在,您基本上必須檢查異步運行的任務。

假設你到GCD電話直接在UIViewController,所以自我是指視圖控制器:

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

由於自身只是一個弱引用您的視圖控制器它不會得到制止視圖控制器被解僱時釋放。當它被釋放時,你的GCD塊內的自己變成零,並且你知道你可以停止你的任務。

所以你只需要在異步塊中檢查self是否每隔一段時間都是零。


注意:不要在主隊列上執行長時間運行的任務,而是在全局隊列或私有隊列中執行長時間運行的任務。使用主隊列阻止主線程執行其他工作,如UI更新,以便您的應用程序凍結。

+0

感謝您的幫助 –