¿Cómo orderar movimientos, inserciones, eliminaciones y actualizaciones en un bloque UICollectionView performBatchUpdates?

En mi UICollectionView , uso una matriz simple de objects personalizados para producir y mostrar celdas. De vez en cuando esos datos cambian y me gustaría animar los cambios a la vez. He elegido hacer esto siguiendo todos los cambios en una segunda matriz, diferenciando los dos, y produciendo un set de operaciones de movimiento, inserción, eliminación y actualización dentro de un bloque performBatchUpdates . Ahora me doy count de que es bastante complicado hacer todo esto dentro del mismo bloque porque tienes que preocuparte por los pedidos de operaciones con índices. De hecho, la respuesta aceptada a este problema es incorrecta (pero corregida en los comentarios).

La documentation parece bastante ausente, pero cubre un caso:

Las eliminaciones se procesan antes de las inserciones en las operaciones por lotes. Esto significa que los índices de las eliminaciones se procesan en relación con los índices del estado de la vista de colección antes de la operación por lotes y los índices de las inserciones se procesan en relación con los índices del estado después de todas las eliminaciones en la operación por lotes.

Sin embargo, el documento no habla de cuándo se procesan los movimientos. Si moveItemAtIndexPath y deleteItemsAtIndexPaths en el mismo performBatchUpdates , ¿los índices de movimiento deben ser relativos al order anterior o posterior a la performBatchUpdates ? ¿Qué hay de insertItemsAtIndexPaths ?

Finalmente, estoy enfrentando problemas llamando a reloadItemsAtIndexPaths y moveItemAtIndexPath en la misma operación:

Excepción fatal: NSInternalInconsistencyException intenta eliminar y volver a cargar la misma ruta de índice

¿Hay alguna manera de hacer todas las operaciones que quiero en el mismo performBatchUpdates ? De ser así, ¿en qué order se procesan las actualizaciones en relación con las otras? Si no es así, ¿qué hacen las personas habitualmente? ¿Volver a cargar los datos después de realizar todas las demás operaciones? ¿Antes de? Preferiría que todas las animaciones sucedieran en una sola etapa.

Para las operaciones de movimiento, el de indexPath es los índices de borrado previo y el indexPath es los índices de borrado posterior. Las recargas solo deben especificarse para indexPaths que no se han insertado, eliminado o movido. Probablemente sea por eso que está viendo NSInternalInconsistencyException .

Una forma práctica de verificar las operaciones se configura correctamente: el set de recargar, insert y mover a indexPaths no debe tener ningún duplicado, y el set de recargar, eliminar y moverse de indexPaths no debe tener duplicates.

ACTUALIZAR:

Parece que los elementos que mueve no se actualizan, sino que solo se mueven. Por lo tanto, si necesita actualizar y mover un elemento, puede realizar la recarga antes o después de la actualización del lote (dependiendo del estado de su fuente de datos).