我正面临着一场噩梦般的performBatchUpdates
崩溃collection 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 节中的项目数无效。更新后现有节中包含的项目数 (213) 必须等于项目数更新前包含在该节中的项目数 (154),加上或减去从该节插入或删除的项目数(40 个插入,0 个删除),加上或减去移入或移出该节的项目数(0 移入, 0 移出)。
我有一些可疑的证据是,如果我打印数据集上的项目数,我会看到准确的 213。因此,数据集匹配正确的数字并且消息是无意义的。
我以前遇到过这个问题,但那是一个 iOS 7 项目。不知何故,现在在 iOS 8 上返回了问题,并且那里的解决方案不起作用,现在数据集IS IN SYNC。