我有一个显示搜索结果的表格视图。它有一个要搜索的所有对象的数组,以及一个过滤对象数组,它们为表视图提供信息。
当用户更改搜索栏中的文本时,我会更新已过滤的数组并重新加载表视图。此外,每个单元格都有一个缩略图,可以在更新表格视图单元格之前异步缓存或下载。
因此,重新加载表格视图数据的两个地方是过滤方法(调用tableView.reloadData()
)和cellForRowAtIndexPath
调用self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimationStyle: .None)
的方法主线程,如果需要下载图像。
因此。我一直有各种各样的问题。我得到的三种错误:
cellForRowAtIndexPath
尝试从数组中清除内容后,由于用户更改了搜索文本,这似乎就会发生这种情况。那我怎么能避免这些问题呢?我现在已经尝试了几天来摆脱这些错误,但我没有尝试过。有没有人有任何想法?感谢。
答案 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.