[英]Cancel UICollectionView updates when view is being dismissed
我最近報告了我的應用程序崩潰,並且我發現了正在發生的事情,並且我需要一些幫助/最佳實踐/最佳方法來解決此問題。
我有一個推送的UICollectionViewController
,它在viewDidLoad
查詢服務器以獲取一些數據以填充UICollectionView
。
我的問題是,如果我按下此UICollectionViewController
,然后快速點擊“后退”按鈕-后台線程仍然繼續獲取服務器數據,但是當獲取數據時,我使用performBatchUpdates()
更新了UICollectionView
,我的應用程序崩潰了。
發生這種情況是因為該應用正在嘗試在不再可見的視圖上重新加載數據。
這里的最佳做法是什么?
如果我要移回以前的VC,有什么方法可以“中止”集合視圖更新?
就像是:
if self.isMovingFromParentViewController { /* abort any update here? */ }
謝謝
您可以使用DispatchWorkItem實現此目標,如下所示
let backgroundQueue = DispatchQueue.global()
var backgroundTask: DispatchWorkItem!
backgroundTask = DispatchWorkItem { [weak self] in
// Perform background task
if !backgroundTask.isCancelled {
return to main Queue
}
backgroundTask = nil // resolve strong reference cycle
}
backgroundQueue.async(execute: backgroundTask)
// When you want to cancel the task
backgroundQueue.async { [weak backgroundTask] in
backgroundTask?.cancel()
}
在許多情況下,我們應該中止所有服務器請求,這是理想的。 我更喜歡在
deinit() {
// Abort all your APIs and asynchronous call
// Release all dependency
}
除此之外,請始終對控制器具有弱引用,然后在異步調用的響應中執行可選綁定。
Almofire.request(reqData: param, method: get.....) {
[weak self] response in
guard let safeSelfRef = self, let safeCollectionView =
safeSelfRef.collectionView else { return }
//Update view here
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.