iOS de Base de Données lors de l'enregistrer dans le contexte?

Je vais avoir des plantages aléatoires avec base de données en raison de la simultanéité et le multithreading. Je sais que les données de base n'est pas thread-safe. J'ai aussi trouvé un couple d'autres réponses sur la façon de créer un ThreadedDataService et instancier contexte distinct pour chaque thread.

C'est un peu trop pour moi d'avaler en ce moment, donc j'essaie de trouver un moyen plus facile de sortir.

La solution que je suis en train en ce moment est simple: de l'enregistrement des données par le thread principal. Cependant, maintenant, une nouvelle question se pose: impasse. L'application ne répond plus, parce que chacun de mes insertions d'un nouveau NSManagedObject est suivi par un appel à enregistrer. (c'est ma meilleure supposition).

La lecture de l'App Délégué de la documentation, j'ai remarqué qu'il me conseille d'enregistrer contexte dans applicationWillTerminate.

Ma question est: est-ce à une longue opération qui permet d'insérer de nouveaux événements à chaque minute, et l'utilisateur n'est pas requis pour voir les mises à jour propagées à tous les contrôleurs immédiatement, quand est-il un bon moment pour moi pour sauver le contexte?
J'ai le sentiment que la sauvegarde de contexte pour chaque enregistrement est peut-être trop?

-(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];      
        }
    }

}

J'ai méthodes comme celles qui sont définies pour l'ensemble de mes objets gérés, est-ce suffisant si je l'appelle, une telle méthode sur un thread principal tous les 10 à 15 minutes pour enregistrer les modifications en attente, plutôt que de le faire après chaque enregistrement d'insertion?

-(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]);

    }

}

Une question supplémentaire après la lecture de macbirdie réponse: est ce genre de méthode juridique en base de données?

-(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 ;
}

}

Merci!

InformationsquelleAutor Alex Stone | 2011-12-10