取消视图时取消UICollectionView更新

时间:2018-02-19 11:44:42

标签: ios swift uicollectionview

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

我在UICollectionViewController上推送viewDidLoad查询服务器以获取一些数据以填充UICollectionView

我的问题是,如果我按下此UICollectionViewController然后快速点击后退按钮 - 后台线程仍然继续获取服务器数据,但是在获取数据时我更新了UICollectionView performBatchUpdates()和我的应用崩溃。

之所以发生这种情况,是因为该应用正在尝试重新加载不再可见的视图上的数据。

这里的最佳做法是什么?

有没有办法让#34; abort"如果我回到之前的VC,收藏视图会更新吗?

类似的东西:

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

由于

2 个答案:

答案 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
}