Erreur de mise à jour insertItemsAtIndexPaths

Dans UICollectionView, j'essaie d'utiliser performBatchUpdates:completion pour effectuer des mises à jour dans ma vue de grid. Mon tableau de sources de données est self.results .

Voici mon code:

 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]; 

Explication de ce que j'ai / ce que je fais:

Ce code s'exécute correctement lorsque l'insertion initiale dans la vue de collection est terminée. Cependant, lorsque j'ajoute / insère plus de données dans ma vue de collection (en mettant à jour self.results et en appelant ceci), ceci donne l'erreur suivante:

* Terminaison de l'application due à l'exception non interceptée 'NSInternalInconsistencyException', raison: 'Invalid update: nombre d'éléments non valide dans la section 0. Le nombre d'éléments contenus dans une section existante après la mise à jour (8) doit être égal au nombre d'éléments contenus dans cette section avant la mise à jour (4), plus ou less le nombre d'éléments insérés ou supprimés de cette section (32 insérés, 0 supprimé) et plus ou less le nombre d'éléments entrés ou sortis de cette section (0 déplacé, 0 déménagé).'

Je comprends que cela signifie que la source de données n'a pas été mise à jour correctement. Cependant, lorsque self.results mon tableau self.results , je vois le nouveau count des données. Je le fais sur la première ligne en utilisant addObjectsFromArray . J'ai également stocké l'ancienne taille de resultsSize dans resultsSize . J'utilise cette variable pour append les paths d'index nouvellement ajoutés dans arrayWithIndexPaths .

Maintenant, en ajoutant / insérant des éléments, j'ai essayé les loops suivantes:

for (id obj in self.results) qui est ce que j'utilise maintenant. Cela fonctionne au début mais insère d'autres accidents.

for (UIImage *image in newData) fonctionne aussi bien au début mais insère d'autres crash.

Du nom de la fonction, je crois que insertItemsAtIndexPaths inserta tous les éléments à ces paths d'index sans boucle. Cependant, sans une boucle, l'application se bloque lorsqu'elle essaie initialement de remplir datatables.

J'ai également essayé de boucler de resultsSize + 1 jusqu'à ce que le nouveau count self.results (qui contient les nouveldatatables) et qui se bloque également lors de la mise à jour initiale.

Des suggestions sur ce que je fais mal?

Je vous remercie,

Je vois plusieurs choses qui ne vont pas ici. Premièrement, je ne suis pas sûr de savoir pourquoi vous utilisez dispatch_sync, je n'ai pas beaucoup d'expérience avec GCD, et je ne pouvais pas le faire fonctionner avec ça (ça semblait bloqué, et l'interface ne répondait pas). Peut-être que quelqu'un d'autre peut aider avec ça. Deuxièmement, dans la boucle où vous ajoutez des paths d'index, vous faites une boucle sur resultsSize, qui, si je comprends bien, est la taille du tableau avant la mise à jour, ce qui n'est pas ce que vous voulez – vous voulez démarrer les nouveaux index resultsSize et boucle jusqu'à resultsSize + newData.count. Enfin, lorsque vous appelez insertItemsAtIndexPaths, vous voulez le faire une fois, pas dans une boucle. J'ai essayé ceci, et cela a fonctionné pour mettre à jour la vue de collection (je ne l'ai pas essayée de zéro avec une vue de collection vide):

 -(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]; }