【发布时间】:2016-06-15 22:10:44
【问题描述】:
我在performBatchUpdatescollection view 上面临着一场噩梦。
问题基本上是这样的:我在服务器上的目录中有很多图像。我想在collection view 上显示这些文件的缩略图。但缩略图必须从服务器异步下载。当它们到达时,它们将使用以下方式插入到集合视图中:
dispatch_async(dispatch_get_main_queue(),
^{
[self.collectionView performBatchUpdates:^{
if (removedIndexes && [removedIndexes count] > 0) {
[self.collectionView deleteItemsAtIndexPaths:removedIndexes];
}
if (changedIndexes && [changedIndexes count] > 0) {
[self.collectionView reloadItemsAtIndexPaths:changedIndexes];
}
if (insertedIndexes && [insertedIndexes count] > 0) {
[self.collectionView insertItemsAtIndexPaths:insertedIndexes];
}
} completion:nil];
});
问题是这个(我认为)。假设在时间 = 0 时,集合视图有 10 个项目。然后我再向服务器添加 100 个文件。应用程序看到新文件并开始下载缩略图。随着缩略图的下载,它们将被插入到集合视图中。但是因为下载可能需要不同的时间,而且这个下载操作是asynchronous,iOS 会在某一时刻失去对集合有多少元素的跟踪,并且整个事情都会因为这个灾难性的臭名昭著的消息而崩溃。
*** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:无效 第 0 节中的项目数。包含在第 0 节中的项目数 更新后的现有节(213)必须等于 更新前该部分中包含的项目 (154),加号或减号 从该部分插入或删除的项目数(40 已插入,0 已删除)并加上或减去移入的项目数 或移出该部分(0 移入,0 移出)。'
我有一些可疑之处的证据是,如果我打印数据集上的项目数,我会看到准确的 213。因此,数据集匹配正确的数字并且消息是无意义的。
我以前遇到过这个问题,here 但那是一个 iOS 7 项目。不知何故,现在在 iOS 8 上又出现了问题,并且那里的解决方案不起作用,现在数据集 IS IN SYNC。
【问题讨论】:
标签: ios iphone uicollectionview performbatchupdates