insertItemsAtIndexPaths更新错误(insertItemsAtIndexPath

2019-09-23 06:25发布

在UICollectionView,我试图用performBatchUpdates:completion执行更新到我的网格视图。 我的数据源阵列是self.results

这里是我的代码:

dispatch_sync(dispatch_get_main_queue(), ^{

            [self.collectionView performBatchUpdates:^{

                int resultsSize = [self.results count];
                [self.results addObjectsFromArray:newData];

                NSMutableArray *arrayWithIndexPaths = [NSMutableArray array];
                if (resultsSize == 0) {
                    [arrayWithIndexPaths addObject:[NSIndexPath indexPathForRow:0 inSection:0]];
                }

                else {
                    for (int i = 0; i < resultsSize; i++) {
                        [arrayWithIndexPaths addObject:[NSIndexPath indexPathForRow:resultsSize + i inSection:0]];
                    }
                }

                for (id obj in self.results)
                    [self.collectionView insertItemsAtIndexPaths:arrayWithIndexPaths];

            } completion:nil];

的我有什么/我在做什么说明:

此代码当初始插入集合视图完成运行正常。 然而,当我添加/插入更多的数据到我的收藏视图(通过更新self.results和调用此),这提供了以下错误:

*终止应用程序由于未捕获的异常“NSInternalInconsistencyException”,原因:“无效更新:在部分0项更新后包含在现有部分中的项目数的无效数(8)必须等于包含在项目数更新(4)之前该节,加上或减去插入或从该段(32插入时,0删除)和加上或减去的项目数移入或移出该部分的已删除的项目的数目(0移动中,0搬出)。'

我明白这意味着数据源没有被正确更新。 然而,我查询时self.results阵列,我看到数据的新的计数。 我这样做,使用第一线addObjectsFromArray 。 我也存储在旧的结果大小resultsSize 。 我使用该变量到新添加的索引路径添加到arrayWithIndexPaths

将现在,当/插入的项目,我想for循环如下:

for (id obj in self.results)这是我现在使用的是什么。 它的工作原理最初,但进一步插入崩溃。

for (UIImage *image in newData)的作品,以及最初但进一步插入崩溃。

从功能的名字,我相信insertItemsAtIndexPaths将插入那些索引路径的所有项目没有环。 然而,如果没有一个循环,应用程序时,它最初试图填充数据崩溃。

我还试图从循环resultsSize + 1 ,直到新的self.results计数(其中包含新的数据),并且也崩溃在初始更新。

关于我做错了什么建议?

谢谢,

Answer 1:

我看到几件事情错在这里。 首先,我不知道为什么你使用dispatch_sync,我没有与GCD很多经验,我无法把它与在那里工作的(它似乎挂起,和UI反应迟钝)。 也许别人可以与帮助。 其次,在您添加索引路径,你遍历resultsSize,这是我的理解,是更新前阵,这是不是你想要的大小循环 - 你想开始新指标resultsSize和环路最多resultsSize + newData.count。 最后,当你调用insertItemsAtIndexPaths,你想这样做一次,而不是在一个循环。 我想这一点,它的工作,以更新集合视图(我没有从头开始与空集视图尝试):

-(void)addNewCells {
    [self.collectionView performBatchUpdates:^{
        int resultsSize = [self.results count];
        [self.results addObjectsFromArray:newData];
        NSMutableArray *arrayWithIndexPaths = [NSMutableArray array];
        for (int i = resultsSize; i < resultsSize + newData.count; i++) {
            [arrayWithIndexPaths addObject:[NSIndexPath indexPathForRow:i inSection:0]];
        }
            [self.collectionView insertItemsAtIndexPaths:arrayWithIndexPaths];
    }
        completion:nil];
}


文章来源: insertItemsAtIndexPaths Update Error