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

时间:2016-08-30 01:24:51

标签: ios uitableview search uisearchcontroller

我有一个显示搜索结果的表格视图。它有一个要搜索的所有对象的数组,以及一个过滤对象数组,它们为表视图提供信息。

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

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

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

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

那我怎么能避免这些问题呢?我现在已经尝试了几天来摆脱这些错误,但我没有尝试过。有没有人有任何想法?感谢。

1 个答案:

答案 0 :(得分:0)

Thanks to someone on Reddit, I found the answer.

Before updating the thumbnail image after asynchronously downloading it, I needed to check if the cell is still being used for the same index path (or for any index path.) Also, I switched from asking the table view to reload the row at that index path to setting the image of the cell's image view.

Basically, inside of cellForRowAtIndexPath, after determining the image needed to be downloaded and then doing so asynchronously, I switched from this:

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

to this:

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

Since I made this change I haven't gotten any crashes.