¿Datos básicos de iOS cuándo save el context?

Estoy teniendo lockings aleatorios con datos centrales debido a la concurrency y multihilo. Sé que los datos principales no son seguros para subprocesss. También encontré un par de respuestas más sobre cómo crear un ThreadedDataService e instanciar un context separado para cada hilo.

Esto es un poco demasiado para mí para tragar en este momento, así que estoy tratando de encontrar una salida más fácil.

La solución que estoy intentando en este momento es simple: save datos a través del hilo principal. Sin embargo, ahora surge un nuevo problema: punto muerto . La aplicación deja de responder porque cada una de mis inserciones de un nuevo NSManagedObject va seguida de una llamada para save. (esa es mi mejor suposition).

Al leer la documentation del Delegado de la aplicación, noté que me aconseja save context en la aplicación Will Termine.

Mi pregunta es esta: para una operación de larga duración que inserta nuevos events cada minuto, y el usuario no está obligado a ver las actualizaciones propagadas a todos los controlleres de inmediato, ¿cuándo es un buen momento para save el context? ¿Tengo la sensación de que save context para cada logging puede ser una exageración?

-(void)insertNewEvent { // Create a new instance of the entity managed by the fetched results controller. NSManagedObjectContext *context = [self.fetchedResultsController.managedObjectContext]; NSEntityDescription *entity = [[self.fetchedResultsControllerfetchRequest] entity]; Event*newManagedObject = (Event*)[NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context]; //use accessor methods to set default values // Save the context. > IS THIS REALLY NEEDED HERE? NSError *error = nil; if (![context save:&error]) { }else { if(newManagedObject!=nil) { currentState= newManagedObject; [currentRecord addEvent:newManagedObject]; //Is this call needed? [self saveApplicationRecords]; } } } 

Tengo methods como estos definidos para todos mis objects gestionados, ¿es suficiente si llamo a ese método en un hilo principal cada 10-15 minutos para save los cambios pendientes, en lugar de hacerlo después de cada inserción de logging?

 -(void)saveApplicationRecords { NSLog(@"saveApplicationRecords"); NSManagedObjectContext *context = [self.applicationRecordsController.managedObjectContext]; // Save the context. NSError *error = nil; if (![context save:&error]) { NSLog(@"Unresolved error %@, %@", error, [error userInfo]); } } 

Una pregunta extra después de leer la respuesta de Macbirdie: ¿es este tipo de método legal en los datos centrales?

 -(Event*)insertAndReturnNewEventWithDate:(NSDate*)date_ type:(int)type { NSManagedObjectContext *context = [self.dreamEventsController managedObjectContext]; NSEntityDescription *entity = [[self.dreamEventsController fetchRequest] entity]; DreamEvent *newManagedObject = (Event*)[NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context]; //handle properties NSError *error = nil; if (![context save:&error]) { return nil; }else { return newManagedObject ; } } 

¡Gracias!

No es necesario save el context al principio del process, especialmente cuando desea modificar el object posteriormente.

En la mayoría de los casos, debe crear un NSManagedObjectContext por separado para los cambios que va a realizar en la database. Así que cree objects en él, complete las properties necesarias, luego envíe save y realice todo el mergeChangesFromContextDidSaveNotification: truco con el context principal (muy probablemente se ejecute en el hilo principal, por lo que se usa el post performSelectorOnMainThread …).

De forma pnetworkingeterminada, un object creado y devuelto por NSManagedObjectContext se autorealiza. Si ha creado un nuevo object y desea editarlo en una hoja de formulario, por ejemplo, puede llamar a setRetainsRegistenetworkingObjects: con YES al context de object gestionado antes de crear el object, por lo que se aferra al object creado hasta que haya terminado con eso. Recuerde que no se recomienda administrar el ciclo de vida de NSManagedObject s por su count; debe dejar que NSManagedObjectContext haga. Entonces, teniendo esto en mente, no tiene que retener el NSManagedObject . Después de la operación de save, no se registra por el context y se elimina de la memory. No se requiere nada de su lado.

Respuesta a la parte de la pregunta actualizada.

Sería probablemente mejor si devolvieras un NSManagedObjectID (usando [object objectID] ) en lugar del object mismo. Permite deshacerse del object de forma segura por el context y, si uno necesita el object para una posterior edición o recuperación de datos (por ejemplo, de otros contexts), puede getlo de la tienda por separado.

Incluso si no guarda el context, el object recién creado está allí y luego puede decidir si desea conservar el object o no.

Después de save, por otro lado, si el context aún existe, puede devolver el object con un NSManagedObjectID desde el caching de memory sin tocar la database.

En otra mano;), en su caso, puede devolver el object con bastante security, ya que el NSManagedObjectContext crea todavía existe, por lo que el object seguirá existiendo, aunque ya esté en el grupo de autorelease.