2011-02-23 5 views
0

Je suis nouveau au monde de base de données et je suis en utilisant iOS 4 comme cadre de base et à l'aide des données de base pour effectuer l'opération contre mon DB SQLight locale, je suis la conception d'applications hors ligne, mais à un moment donné lorsque l'utilisateur vient en ligne j'ai besoin de tirer quelques données mises à jour du serveur et de pousser la même chose dans la base de données locale, en même temps que l'utilisateur pourrait effectuer des insertions et mis à jour dans la même base de données via l'interface utilisateur.données de base avec des opérations parallèles

Il y aurait donc deux séries d'opérations qui se produisent sur la même base de données sur en même temps

1) L'utilisateur ferait des insertions ou des mises à jour par l'interface utilisateur Vues

2) moteur de synchronisation en arrière-plan pourrait Dans ce cas, le contexte géré partagé peut être sauvegardé [avec save contexte: & error];], car il y a une possibilité que le contexte finisse par être sauvegardé dans la base de données locale

sauver les mauvaises données.

je puisse penser à avoir deux solutions pour la même

1) Création d'une autre mémoire persistante montrant même DB, mais cela pourrait conduire à une forte consommation de mémoire sur le dispositif

2) Création d'autre fil pour moteur de synchronisation, mais je ne sais pas comment y faire face.

Pouvez-vous les gars vous plaît ombre un peu de lumière à ce sujet, ou ce que je pense dans le sens tout à fait tort?

Merci Ajay Sawant

Répondre

3

Personnellement, j'utiliser des fils. (En fait, j'utiliserais un NSOperation mais c'est juste un fil de fantaisie).

Ne jamais partager un contexte géré entre les threads.

Si vous voulez que vos transactions soient séparées (à savoir les mises à jour fond, etc.), utilisez un contexte d'objet géré différent pour chacun.

Vous ne devez utiliser un persistentStoreCoordinator mais créer un managedObjectContext de celui-ci pour chaque fil dans votre application.

Cela signifie également que vous ne pouvez pas passer des objets gérés entre les threads, mais il est tout à fait de passer objectIds-à-dire si vous voulez dire la principale chose de fil a été fait:

// On your background thread . . . 

[managedObjectContext save:nil]; 

NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:[myThing objectID], @"id", nil]; 
[NSNotificationCenter defaultCenter] postNotificationName:@"something-happened" object:self userIfno:userInfo]; 

Sur le thread principal, vous devriez Utilisez la méthode objectWithID pour obtenir un nouvel objet géré pour managedObjectContext du thread principal.

See this document for more details

+0

Ne jamais partager un contexte géré entre les threads. +1 – gbk

Questions connexes