Tag: performbatchupdates

与performBatchUpdates崩溃的恶梦

在收集视图的performBatchUpdates期间,我正面临崩溃的噩梦。 问题基本上是这样的:我在服务器上的目录上有很多图像。 我想在集合视图中显示这些文件的缩略图。 但是缩略图必须从服务器asynchronous下载。 当他们到达他们将被插入收集视图使用这样的事情: 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会丢失跟踪这个集合有多less元素,并且整个事情会随着这个灾难性的臭名昭着的消息而崩溃。 ***由于未捕获的exception“NSInternalInconsistencyException”而终止应用程序,原因是:“无效的更新:部分0中的项目数目无效。更新(213)后现有部分中包含的项目数量必须等于项目数量包含在更新前的那一部分(154)中,加上或减去从该部分插入或删除的项目数(插入40个,删除0个),加上或减去移入或移出该部分的项数(0移入,0搬出)。 certificate我有一些可疑的事情是,如果我打印数据集上的项目的数量,我确切地看到213.因此,数据集匹配正确的数字和消息是无稽之谈。 我以前有过这个问题,但是这是一个iOS […]

如何解决这个CollectionView崩溃?

我的应用程序有两个CollectionViewController 。 在给定的时间只有一个可见。 我在故事板上创build了以下结构:两个容器视图在彼此之上。 每个容器视图都有一个embedded的CollectionViewController 。 特定容器视图的可见性决定了哪个collectionViewController可见。 这就是问题。 两个CollectionViewController并行地接收数据,但是iOS有一个bug,如果一个CollectionViewController尝试在不可见的时候使用performBatchUpdates执行一个插入操作,那么这个bug会导致应用程序崩溃。 试图阻止这一点,我已经在两个CollectionViewController上创build了一个BOOL标志,以便他们可以知道它们是否可见并执行或者不是performBatchUpdates 。 就像是: if (self.isThisCollectionViewVisible == NO) return; [self.collectionView performBatchUpdates:^{ // bla bla… perform insert,m remove… 这解决了部分问题。 但是,应用程序继续在以下情况下崩溃:如果我点击button切换到不可见的CollectionViewController ,使其在接收更新时可见。 我的意思是:让我们调用第一个CollectionViewController , B调用第二个。 A是可见的,而B在这一点上是不可见的。 B开始接收数据,并试图执行一个performBatchUpdates但因为它是不可见的,所以if (self.isThisCollectionViewVisible == NO) return; 阻止performBatchUpdates运行,什么是好的。 现在我让A看不见, B看得见。 此时,标志self.isThisCollectionViewVisible被设置为YES , performBatchUpdates使应用程序崩溃,并显示以下错误: *断言失败 – [CollectionView _endItemAnimationsWithInvalidationContext:tentativelyForReordering:],/BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3512.60.7/UICollectionView.m:4625 *终止应用程序由于未捕获的exception'NSInternalInconsistencyException ',原因是:'更新无效:部分0中的项目数目无效。更新之后现有部分中包含的项目数目(76)必须等于更新前部分中包含的项目数目(70),加上或减去从该部分插入或删除的项目数(插入5个,删除2个),加上或减去移入或移出该部分的项目数(移入0个,移出0个)。 我认为CollectionViewController实际上还没有准备好和更新,能够执行performBatchUpdates …这不是以前更新数据源,因为它正在更新的问题。 我可以做什么检查来防止这种情况发生? 注:我特别注意到这个崩溃有些奇怪的东西。 它说5个元素被插入,2个被删除,但实际上3个元素被插入,0个被删除,2个在发生崩溃时被改变。