我最近在我的应用中报告了一次崩溃,我已经发现了正在发生的事情,我需要一些帮助/最佳做法/最佳方法解决这个问题。
我在UICollectionViewController
上推送viewDidLoad
查询服务器以获取一些数据以填充UICollectionView
。
我的问题是,如果我按下此UICollectionViewController
然后快速点击后退按钮 - 后台线程仍然继续获取服务器数据,但是在获取数据时我更新了UICollectionView
performBatchUpdates()
和我的应用崩溃。
之所以发生这种情况,是因为该应用正在尝试重新加载不再可见的视图上的数据。
这里的最佳做法是什么?
有没有办法让#34; abort"如果我回到之前的VC,收藏视图会更新吗?
类似的东西:
if self.isMovingFromParentViewController { /* abort any update here? */ }
由于
答案 0 :(得分:1)
您可以使用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()
}
答案 1 :(得分:0)
在我们应该中止所有服务器请求的许多情况下,这是可取的。我更喜欢在
中执行所有清理工作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
}