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

Posted

技术标签:

【中文标题】使用导致崩溃的搜索结果更新表视图【英文标题】:Updating table view with search results causing crashes 【发布时间】:2016-08-30 01:24:50 【问题描述】:

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

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

所以,重新加载表视图数据的两个地方是在过滤方法中,它调用tableView.reloadData(),以及在cellForRowAtIndexPath,它在主线程上调用self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimationStyle: .None),如果需要图像已下载。

所以。我一直有各种各样的问题。我得到的三种错误:

致命错误:索引超出范围。这似乎发生在cellForRowAtIndexPath 尝试从数组中获取内容时,因为用户更改了搜索文本,因此数组被清空。 表格视图错误:例如,尝试将第 34 行插入第 0 节时出错。我不确定是什么原因导致这种情况发生,但我猜它试图在表格视图没有节时插入行,因为数组为空。 内部不一致异常:发生这种情况时我没有得到任何额外信息,它只是崩溃。所以我也不知道这里有什么问题。

那么我该如何避免这些问题呢?我已经尝试了几天来摆脱这些错误,但我没有尝试任何工作。有没有人有任何想法?谢谢。

【问题讨论】:

请提供一些 tableView 代表的代码,以便更好地了解问题。 【参考方案1】:

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

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

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

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

到这里:

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

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

【讨论】:

以上是关于使用导致崩溃的搜索结果更新表视图的主要内容,如果未能解决你的问题,请参考以下文章

获取的结果导致部分崩溃

滚动表视图并单击搜索器崩溃应用程序

核心数据多对多关系导致获取的结果控制器崩溃

搜索栏导致应用程序在我的 ios 库中崩溃

获取结果崩溃(使用 persistentContainer) - 核心数据目标 C

表视图搜索栏