Problema interesante con UICollectionView reloadData

Al tratar con un UICollectionView en mi aplicación, me encontré con un extraño problema relacionado con la recarga de datos. Después de muchos errores de debugging y análisis de loggings, he llegado a la conclusión de que si reloadData es seguido inmediatamente por insertItemsAtIndexPaths se garantiza que ocurra el temido error siguiente:

Nombre: NSInternalInconsistencyException Motivo: Actualización no válida: número inválido de elementos en la sección 0. El número de elementos contenidos en una sección existente después de la actualización (1) debe ser igual al número de elementos contenidos en esa sección antes de la actualización (1), más o less el número de elementos insertados o eliminados de esa sección (1 insertado) …

El único path para que esto ocurra de manera consistente es que internamente el UICollectionView todavía está ocupado con reloadData cuando reloadData la llamada a insertItemsAtIndexPaths . El hecho de que " collectionView:numberOfItemsInSection " se insertItemsAtIndexPaths dos veces seguidas antes de que el insertItemsAtIndexPaths finalice parece admitir esto ya que ese método nunca se llama dos veces seguidas en otros casos de llamada.

¿Alguien ha visto un comportamiento similar o puede confirmar mi análisis o incluso sugerir una solución adecuada?

Actualización : cualquier sí, me he asegurado de que todas las invocaciones relevantes se produzcan en el hilo principal.

Actualización 2 : Dado que el razonamiento detrás de entrar en esta situación ha sido cuestionado: estoy usando Monotouch y el código en cuestión tiene la intención de mantener .Net Collections genéricas activando este evento en las llamadas apropiadas para mantener el UICollectionView enlazado a la colección en sintonía. Cuando se borra la colección de origen, reactjs con una acción de restablecimiento , seguida de una o más acciones de adición cuando se insertan elementos que conducen al problema descrito anteriormente. Espero que esto ayude.

Cuando insertItemsAtIndexPaths ( removeItemsAtIndexPaths es análogo), le dice a su colecciónview que su fuente de datos ahora tiene más elementos disponibles y que debe insert estos elementos disponibles en las routes indicadas que especifique.

Comtesting su fuente de datos si esa statement es verdadera y si detecta que la cantidad de elementos anteriores más la cantidad de elementos que dice que insertó no es igual a la cantidad de elementos nuevos, dice que no puede hacer la actualización, como mentiste sobre cuántos artículos has cambiado.

Ahora, lo que está haciendo es que está diciendo a su colección que debe recargar todos sus datos de su fuente de datos (con los nuevos datos) y luego de eso, le dice que insertó x elementos. Esa es una statement falsa, ya que acaba de volver a cargar la vista de colección, que actualizó su cantidad de elementos y, por lo tanto, la cantidad de elementos antes de la actualización es igual a la cantidad de elementos después de la actualización (no está haciendo nada) y no aumentado por la cantidad de routes de índice que especificó.

Espero que sigas conmigo, porque esta es tu solución:

Elimine los datos de reloadData antes de insertItemsAtIndexPaths , ya que esto rompe sus aserciones y arrojará excepciones cuando se usa incorrectamente. Si desea volver a cargar la vista de colección antes de insert elementos, asegúrese de realizar insertItemsAtIndexPaths justo después de cambiar los elementos en el origen de datos.

Lee aquí la documentation de este método.