8

No estoy seguro si esto es un problema con la forma en que Magical Record guarda, o simplemente estoy cometiendo un error novato en alguna parte.Magical Record, saving, and NSFetchedResultsController

Estoy usando NSFetchedResultController (FRC) y UITableView para mostrar una lista de entidades, cuando el usuario toca "Agregar" se empuja un nuevo Controlador de Vista con un editor, se crea una nueva entidad con [MyEntity MR_createEntity]. El usuario puede agregar entidades adicionales aquí que se agregan a la entidad principal a través de una relación. Cuando el usuario toca "Guardar" en este Controlador de Vista, el contexto se guarda usando [[NSManagedObjectContext MR_contextForCurrentThread] MR_save]

Parece que NSFetchedResultsController se actualiza, pero cuando toco para editar la entidad, ninguna de las entidades secundarias está ahí. La depuración parece mostrar que, aunque la entidad se ha guardado, FRC todavía tiene la entidad con su ID temporal.

Estoy haciendo una ingenua [self.tableView reloadData] en el método delegado FRC controllerDidChangeContent.

Al reiniciar la aplicación se cargan las entidades correctas y las entidades secundarias se muestran correctamente en el controlador de vista del editor.

Parece que el FRC responde al evento de salvar "hilo principal", pero el guardado realmente está sucediendo en un hilo de fondo para que el FRC no lo vea. He verificado y todas las operaciones "mías" (configuración de FRC, creación y recuperación de entidades) están sucediendo en el contexto del hilo principal.

Intenté escuchar las notificaciones de cambio en MR_rootSavingContext y fusionarlas con el contexto del subproceso principal, que funcionó pero terminé con filas duplicadas en el FRC (una era la entidad correcta "permanente" y una era la temporal)

Respuesta

8

Bien, no estoy seguro de si esta es "la manera correcta de hacerlo" pero he encontrado que funciona correctamente si he creado NSFetchedResultsController en MR_rootSavingContext en lugar del contexto predeterminado utilizando la versión "inContext" de MR_fetchAllSortedBy.

Supongo que esto tiene sentido desde el punto de vista de que el FRC ahora está mirando el rootSavingContext en lugar de uno de sus hijos. Aún así, hubiera pensado que ya que estoy haciendo todas mis operaciones en el mismo hilo, eso no sería un problema.

Actualización: El gotcha con este enfoque es que si me acaba de agarrar la entidad utilizando [frc objectAtIndexPath:] para darle al controlador de vista de edición entonces ya no está en el contexto predeterminado. Se solucionó esto recuperando la entidad en el contexto predeterminado utilizando el existingObjectWithID de NSManagedObjectContext. Todavía no me siento del todo bien, pero está funcionando para mí.

+0

tengo un problema similar donde puede encontrar http://stackoverflow.com/questions/11212702/nspredicate-not-executed por desgracia no sé lo que lo está causando, pero también tengo la misma situación en la que parece que mi contexto predeterminado no está realmente actualizado (en cierto sentido). –

+0

Yo también, y acabo de comentar el problema de Fabiano. El uso de MR_rootSavingContext no parece ayudarme, y puedo usar una versión anterior de MR, que sé que funciona. –

+0

+1 porque esto solucionó mi problema, ver mi respuesta a http://stackoverflow.com/questions/11212702/nspredicate-not-executed/11407413#comment15080320_11407413 – Otto

0

en cuenta que es una respuesta de edad, pero ninguno de los anteriores trabajado para mí y espero que ayudará a los lectores futuros

Para mí el problema fue causado por tratar de configurar una tienda puramente local con un archivo de SQLite que habían sido previamente utilizado con iCloud.

Básicamente traté de implementar iCloud con mi aplicación CoreData, hice los pasos básicos para configurarlo con un contenedor de ubicuidad, etc. pero luego volví debido a la inestabilidad inherente que esto parecía causar (¿por qué CoreData e iCloud STILL? ¡¿No te llevas bien ?!), pero a Cocoa no le gusta que te desvíes de esa manera.

Afortunadamente no he hecho esto en una aplicación en vivo por lo que es relativamente fácil de cambiar, ya que sólo afectará a los dispositivos de desarrollo, pero si se está moviendo desde iCloud a una tienda local de una aplicación en vivo que pensar que podría tener que echa un vistazo a una de estas soluciones:

Migrating a Core Data Store from iCloud to local

Cuestiones relacionadas