使用导致崩溃的搜索结果更新 table 视图
Updating table view with search results causing crashes
我有一个显示搜索结果的 table 视图。它有一个包含所有要搜索的对象的数组,以及一个过滤对象的数组,用于提供 table 视图。
当用户更改搜索栏中的文本时,我更新过滤后的数组并重新加载 table 视图。此外,每个单元格都有一个缩略图,该缩略图在更新 table 视图单元格之前被缓存或异步下载。
因此,table 视图的数据被重新加载的两个地方是在过滤方法中调用 tableView.reloadData()
和在 cellForRowAtIndexPath
中调用 self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimationStyle: .None)
在主线程上,如果需要下载图片。
所以。我遇到了各种各样的问题。我遇到的三种错误:
- 致命错误:索引超出范围。当
cellForRowAtIndexPath
由于用户更改了搜索文本而清空数组后试图从数组中获取内容时,似乎会发生这种情况。
- table 视图错误:例如,尝试将第 34 行插入第 0 节时出错。我不确定是什么原因导致这种情况发生,但我猜它试图在 table 由于数组为空,视图没有任何部分。
- 内部不一致异常:发生这种情况时我没有得到任何额外信息,它只是崩溃了。所以我也不知道这里有什么问题。
那么如何避免这些问题呢?我已经尝试了几天来摆脱这些错误,但我尝试的任何方法都不起作用。有人有什么想法吗?谢谢。
感谢 Reddit 上的某个人,我找到了答案。
在异步下载后更新缩略图之前,我需要检查单元格是否仍在用于相同的索引路径(或任何索引路径)。另外,我从询问 table 查看以重新加载该索引路径处的行以设置单元格图像视图的图像。
基本上,在 cellForRowAtIndexPath 内部,在确定需要下载的图像然后异步执行后,我从这里切换:
NSOperationQueue.mainQueue().addOperationWithBlock {
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .None)
}
对此:
NSOperationQueue.mainQueue().addOperationWithBlock {
if indexPath == tableView.indexPathForCell(cell) {
cell.imageView?.image = downloadedThumbnail
}
}
自从我进行此更改后,我没有遇到任何崩溃。
我有一个显示搜索结果的 table 视图。它有一个包含所有要搜索的对象的数组,以及一个过滤对象的数组,用于提供 table 视图。
当用户更改搜索栏中的文本时,我更新过滤后的数组并重新加载 table 视图。此外,每个单元格都有一个缩略图,该缩略图在更新 table 视图单元格之前被缓存或异步下载。
因此,table 视图的数据被重新加载的两个地方是在过滤方法中调用 tableView.reloadData()
和在 cellForRowAtIndexPath
中调用 self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimationStyle: .None)
在主线程上,如果需要下载图片。
所以。我遇到了各种各样的问题。我遇到的三种错误:
- 致命错误:索引超出范围。当
cellForRowAtIndexPath
由于用户更改了搜索文本而清空数组后试图从数组中获取内容时,似乎会发生这种情况。 - table 视图错误:例如,尝试将第 34 行插入第 0 节时出错。我不确定是什么原因导致这种情况发生,但我猜它试图在 table 由于数组为空,视图没有任何部分。
- 内部不一致异常:发生这种情况时我没有得到任何额外信息,它只是崩溃了。所以我也不知道这里有什么问题。
那么如何避免这些问题呢?我已经尝试了几天来摆脱这些错误,但我尝试的任何方法都不起作用。有人有什么想法吗?谢谢。
感谢 Reddit 上的某个人,我找到了答案。
在异步下载后更新缩略图之前,我需要检查单元格是否仍在用于相同的索引路径(或任何索引路径)。另外,我从询问 table 查看以重新加载该索引路径处的行以设置单元格图像视图的图像。
基本上,在 cellForRowAtIndexPath 内部,在确定需要下载的图像然后异步执行后,我从这里切换:
NSOperationQueue.mainQueue().addOperationWithBlock {
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .None)
}
对此:
NSOperationQueue.mainQueue().addOperationWithBlock {
if indexPath == tableView.indexPathForCell(cell) {
cell.imageView?.image = downloadedThumbnail
}
}
自从我进行此更改后,我没有遇到任何崩溃。