Pregunta

En UICollectionView, estoy tratando de usar performBatchUpdates:completion para realizar las actualizaciones a mi vista de cuadrícula.Mi fuente de datos de la matriz es self.results.

Aquí está mi código:

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

Explicación de lo que tengo / lo que yo estoy haciendo:

Este código funciona bien cuando la inserción inicial en la vista de colección está hecho.Sin embargo, cuando puedo añadir/insertar más datos en mi colección (mediante la actualización de self.results y llamando a esto), esto da el siguiente error:

* La terminación de la aplicación debido a uncaught exception 'NSInternalInconsistencyException', la razón:'No válido actualización:no válido número de elementos en la sección 0.El número de elementos contenidos en un sección existente después de la actualización (8) debe ser igual al número de los elementos contenidos en esa sección antes de la actualización (4), más o menos el número de elementos insertados o eliminados de esa sección (32 inserta, 0 eliminado) y más o menos el número de elementos que se mueven en o fuera de esa sección (0 movido en, 0 mudado).'

Entiendo que esto significa que el origen de datos no se ha actualizado correctamente.Sin embargo, al consultar mi self.results matriz, veo el nuevo recuento de los datos.Yo estoy haciendo eso en la primera línea el uso de addObjectsFromArray.Yo también almacena los resultados anteriores de tamaño en resultsSize.Yo uso esa variable para agregar el nuevo índice de caminos en arrayWithIndexPaths.

Ahora al añadir/insertar elementos, he intentado lo siguiente para bucles:

for (id obj in self.results) que es lo que estoy usando ahora.Funciona al principio, pero más inserciones de accidentes.

for (UIImage *image in newData) funciona igual de bien en un principio pero más insertos de bloqueo.

Desde el nombre de la función, yo creo que insertItemsAtIndexPaths va a insertar todos los elementos en los índice de caminos sin un bucle.Sin embargo, sin un bucle, la aplicación se bloquea cuando inicialmente intenta rellenar los datos.

También traté de bucle de resultsSize + 1 hasta que el nuevo self.results count (que contiene los nuevos datos) y que también se bloquea en la actualización inicial.

Cualquier sugerencia acerca de lo que estoy haciendo mal?

Gracias,

¿Fue útil?

Solución

Veo varias cosas mal aquí.En primer lugar, no estoy seguro de por qué usted está usando dispatch_sync, no tengo mucha experiencia con MCD, y no pude hacer que funcione con eso (que parecía colgar, y de la interfaz de usuario no responde).Tal vez alguien te pueda ayudar con eso.En segundo lugar, en el bucle donde agregar índice de caminos, eres un bucle por resultsSize, que como yo lo entiendo, es el tamaño de la matriz antes de la actualización, que no es lo que usted quiere-quiere iniciar los nuevos índices en resultsSize y bucle resultsSize + nuevosdatos.el recuento.Por último, cuando usted llame insertItemsAtIndexPaths, usted quiere hacer esto una vez, no en un bucle.He intentado esto, y se trabajó para actualizar la vista de colección (yo no lo intente desde el principio con una colección vacía de la vista):

-(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];
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top