2010-07-21 8 views
0

Je suis en train de développer une application qui analyse les données XML ant en CoreData. Je veux qu'il démarre rapidement, donc je charge les données à partir de CoreData d'abord, et après charger et analyser XML dans un autre thread. Le problème est que lorsque l'application commence première fois CoreData est vide et je commence à analyser:ExecuteFetchRequest une seconde fois si la première fois que CoreData était vide

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"SlideItem" inManagedObjectContext:managedObjectContext]; 
[request setEntity:entity]; 

// Execute the fetch -- create a mutable copy of the result. 
NSError *error = nil; 
NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; 

if (mutableFetchResults == nil) 
{ 
    // Handle the error. 
    NSLog(@"mutableFetchResults == nil"); 
} 

NSLog(@"mutableFetchResults count = %d", [mutableFetchResults count]); 

if ([mutableFetchResults count] == 0) // if DB is empty 
{ 
    [self loadAndParse]; // here I do it in the main thread 
    //so my CoreData is filled with data here 
} 
//but if try to execute my request again like this: 
mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; 
//it is empty again 

Comment puis-je faire? merci

Répondre

2

Vous devez fusionner les modifications de l'autre contexte dans le thread où le xml est analysé. Jusqu'à ce que vous faites cela, le contexte sur le thread principal ne sait pas ce qui a été changé.

Utilisation:

-[NSManagedObjectContext mergeChangesFromContextDidSaveNotification:] 

ou

-[NSManagedObjectContext refreshObject:mergeChanges:] 
+0

Merci, Comment faire? Je suis nouveau à l'objectif-c donc il faut clair, J'ai essayé [NSManagedObjectContext refreshObject: managedObjectContext mergeChanges: YES]; mais cela ne fonctionne pas ( – Burjua

+0

Et BTW c'est le même thread)) – Burjua

+0

'refreshObject:' est appelée à partir du contexte qui effectue la modification. Vous ne passez pas le contexte, vous passez l'objet modifié. 'mergeChanges' est appelé après l'enregistrement du contexte A pour la notification' ContextDidSave' du contexte B. – TechZen

1

Si vous chargez vos données analysées dans un contexte d'objet géré différent de celui que vous utilisez dans ce qui précède snipped, alors vous devez faire comme TechZen suggère et fusionne les changements entre ces contextes. Apple fournit une bonne explication dans leur exemple CoreDataBooks. Regardez le fichier RootViewController.m et commencez à lire les commentaires pour la méthode addViewController: didSave:. Tout le code est là pour fusionner les changements entre deux contextes d'objets gérés discrets (dans CoreDataBooks, ils créent un contexte d'objet géré séparé pour éditer une nouvelle entité de livre). Si, d'autre part, votre loadAndParse: utilise le même contexte d'objet géré que le code ci-dessus, je ne pense pas que vous ayez réussi à ajouter quelque chose au Core Data Store. Dans ce cas, le problème est probablement lié à la méthode loadAndParse:

Questions connexes