Ошибка обновления insertItemsAtIndexPaths
-
11-12-2019 - |
Вопрос
В 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];
}