Вопрос

В 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 count (который содержит новые данные) и который также выходит из строя при первоначальном обновлении.

Есть какие-нибудь предложения по поводу того, что я делаю не так?

Спасибо,

Это было полезно?

Решение

Я вижу здесь несколько неправильных вещей.Во-первых, я не уверен, почему вы используете dispatch_sync, у меня нет большого опыта работы с GCD, и я не смог заставить его работать с этим там (казалось, он зависал, а пользовательский интерфейс не отвечал).Возможно, кто-то еще сможет помочь с этим.Во-вторых, в цикле, где вы добавляете пути к индексам, вы зацикливаетесь на ResultSize , который, как я понимаю, является размером массива до обновления, что не то, что вы хотите - вы хотите запустить новые индексы в ResultSize и выполнить цикл до ResultSize + 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];
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top