Ios 取消取消视图时的UICollectionView更新

Ios 取消取消视图时的UICollectionView更新,ios,swift,uicollectionview,Ios,Swift,Uicollectionview,我最近在我的应用程序中报告了一个崩溃,我发现了正在发生的事情,我需要一些帮助/最佳实践/解决这个问题的最佳方法 我有一个按下的UICollectionViewController,它在viewdiload上查询服务器获取一些数据以填充UICollectionView 我这里的问题是,如果我按下这个UICollectionViewController,然后快速点击后退按钮-后台线程仍会继续获取服务器数据,但当数据被获取时,我会用performbatchUpdate()更新UICollectionV

我最近在我的应用程序中报告了一个崩溃,我发现了正在发生的事情,我需要一些帮助/最佳实践/解决这个问题的最佳方法

我有一个按下的
UICollectionViewController
,它在
viewdiload
上查询服务器获取一些数据以填充
UICollectionView

我这里的问题是,如果我按下这个
UICollectionViewController
,然后快速点击后退按钮-后台线程仍会继续获取服务器数据,但当数据被获取时,我会用
performbatchUpdate()
更新
UICollectionView
,我的应用程序崩溃

在这里发生这种情况是因为应用程序试图在不再可见的视图上重新加载数据

这里的最佳实践是什么

如果我要回到以前的VC,有没有办法“中止”集合视图更新

比如:

if self.isMovingFromParentViewController { /* abort any update here? */ }

谢谢

这在许多情况下都是可取的,因为我们应该中止所有服务器请求。我更喜欢在房间里进行所有的清理工作

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
}

您可以使用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()
}

您正在更新主线程上的集合视图吗?我也觉得你可能在那里漏过水。为什么当你返回时控制器仍然被分配。我正在更新主线程。这很奇怪。我在后台查询服务器,并在main上调度以更新
cv
。不知何故,它在被解除后仍在继续,当它到达
performBatchUpdates
时,它崩溃了。嗯。。。在更新视图之前,我没有考虑过创建对自我的弱引用。我会尝试你展示的,我会反馈:)好提示,我正在尝试这个out@IvanCantarino我已经更新了我的答案,以便更好地理解你。采用您提到的方法是有效的,因此我无论如何都需要创建
[弱自我]
,以避免访问任何可能保留的本地对象