2011-12-08 12 views
10

Estoy instanciando un objeto NSManagedObjectContext en el nivel de delegado de Aplicación y lo estoy compartiendo en todos mis UIViewController s. Aquí está el código que utilizo para acceder a ella en una de mis controladores Ver:CoreData: Borrar cambios de NSManagedObjectContext

 NSManagedObjectContext *managedObjectContext = appDelegate.managedObjectContext; 
     modelObj = (Model *) [NSEntityDescription insertNewObjectForEntityForName:@"Model" inManagedObjectContext:[appDelegate managedObjectContext]]; 

Ahora en esta pantalla, tengo una cada célula UITableView con 9 filas & tiene una UITextField. A medida que el usuario ingresa valores en los campos de texto, los asigno a modelObj. Ahora, mi usuario tiene una opción para cancelar y descartar todos los cambios o guardarlos en el disco. Tengo el código de guardar funcionando bien. Pero en el caso de que un usuario intente descartar los cambios, no estoy seguro de qué hacer. No parece haber un método [managedObjectContext discardChanges] para descartarlos.

Puedo pensar en un par de maneras de resolver esto.

  • crear una nueva instancia de NSManagedObjectContext para cada controlador en lugar de compartir uno al otro lado de la aplicación.
  • O bien, podría crear un grupo de NSString s en mi código y guardar los valores de usuario en ellos y llamar al insertNewObjectForEntityForName: solo si el usuario hace clic en guardar.

¿Cuál es la correcta? ¿O hay una manera de hacer que NSManagedObjectConext descarte todos los cambios que se le hicieron?

Gracias,
Teja.

+1

La respuesta de Tim Dean es correcta. Pero tampoco sería un enfoque equivocado crear un contexto secundario para esta pantalla de edición, insertar allí su nuevo objeto y solo guardarlo en el contexto principal si el usuario lo confirma. De lo contrario, simplemente tira al niño y terminarás. –

Respuesta

36

NSManagedObjectContext tiene un método simple para esto:

[managedObjectContext rollback]; 

Este método de "quita todo, desde la pila de deshacer, descarta todas las inserciones y deleciones, y restaura actualiza objetos a sus últimos valores comprometidos." (documentation)

A menos que me falta algo, que debe darle todo lo que necesita.

+2

Dado que la cuestión se etiqueta con iOS podría ser útil mencionar que el método de reversión requiere que un 'undoManager' se asigna a la MOC, que en el caso de iOS creo que no es por defecto y por lo harán' rollback' nada. –

+1

Aquí está la referencia que respalda el comentario de @ ChristopherKing [apple docs] (https://developer.apple.com/library/ios/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectContext_Class/#//apple_ref/occ/instp/NSManagedObjectContext/undoManager). Asegúrese de agregar un 'NSUndoManager' a su' NSManagedObjectContext' para que admita las operaciones 'deshacer' o' rollback'. –

2

Puede estar buscando -refreshObject:mergeChanges: - los documentos dicen que restablece un objeto de la tienda persistente, y si pasa NO como segundo argumento, puede optar por no volver a aplicar los cambios que se han realizado.

Esto probablemente requerirá que le permite almacenar un conjunto de objetos que ha cambiado (para el primer argumento), y luego despejado ese conjunto cuando confirma los cambios en su contexto a la tienda. Sin embargo, esto debería ser una adición bastante trivial.

Cuestiones relacionadas