使用导致崩溃的搜索结果更新 table 视图

Updating table view with search results causing crashes

我有一个显示搜索结果的 table 视图。它有一个包含所有要搜索的对象的数组,以及一个过滤对象的数组,用于提供 table 视图。

当用户更改搜索栏中的文本时,我更新过滤后的数组并重新加载 table 视图。此外,每个单元格都有一个缩略图,该缩略图在更新 table 视图单元格之前被缓存或异步下载。

因此,table 视图的数据被重新加载的两个地方是在过滤方法中调用 tableView.reloadData() 和在 cellForRowAtIndexPath 中调用 self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimationStyle: .None) 在主线程上,如果需要下载图片。

所以。我遇到了各种各样的问题。我遇到的三种错误:

那么如何避免这些问题呢?我已经尝试了几天来摆脱这些错误,但我尝试的任何方法都不起作用。有人有什么想法吗?谢谢。

感谢 Reddit 上的某个人,我找到了答案。

在异步下载后更新缩略图之前,我需要检查单元格是否仍在用于相同的索引路径(或任何索引路径)。另外,我从询问 table 查看以重新加载该索引路径处的行以设置单元格图像视图的图像。

基本上,在 cellForRowAtIndexPath 内部,在确定需要下载的图像然后异步执行后,我从这里切换:

NSOperationQueue.mainQueue().addOperationWithBlock {
    tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .None)
}

对此:

NSOperationQueue.mainQueue().addOperationWithBlock {
    if indexPath == tableView.indexPathForCell(cell) {
        cell.imageView?.image = downloadedThumbnail
    }
}

自从我进行此更改后,我没有遇到任何崩溃。