2009-11-25 3 views
1

Mise à jour: Actuellement à la recherche dans minusSet de nsset liens: Comparing Two Arraysmise à jour en vrac et insertion occasionnelle (de CoreData) - Trop lent

Salut les gars,

pourraient bénéficier de votre sagesse ici ..

I » En utilisant Coredata dans mon application, au premier lancement, je télécharge un fichier de données et insère plus de 500 objets (chacun avec 60 attributs) - rapide, pas de problème. Chaque lancement suivant je télécharge une version mise à jour du fichier, à partir de laquelle j'ai besoin de mettre à jour tous les attributs des objets existants (sauf peut-être 5 attributs) et en créer de nouveaux pour les éléments qui ont été ajoutés au fichier téléchargé.

Ainsi, le premier lancement je reçois 500 objets .. dire une semaine plus tard mon dossier contient maintenant 507 articles ..

Je crée deux tableaux, l'un pour existants et un pour les télécharger.

NSArray *peopleArrayDownloaded = [CoreDataHelper getObjectsFromContext:@"person" :@"person_id" :YES :managedObjectContextPeopleTemp]; 
NSArray *peopleArrayExisting = [CoreDataHelper getObjectsFromContext:@"person" :@"person_id" :YES :managedObjectContextPeople]; 

Si le nombre de chaque tableau est égal alors je fais ceci:

NSUInteger index = 0; 
if ([peopleArrayExisting count] == [peopleArrayDownloaded count]) { 
    NSLog(@"Number of people downloaded is same as the number of people existing"); 
    for (person *existingPerson in peopleArrayExisting) { 
     person *tempPerson = [peopleArrayDownloaded objectAtIndex:index]; 
     // NSLog(@"Updating id: %@ with id: %@",existingPerson.person_id,tempPerson.person_id); 
     // I have 60 attributes which I to update on each object, is there a quicker way other than overwriting existing? 
     index++; 
    } 
} else { 
    NSLog(@"Number of people downloaded is different to number of players existing"); 

Alors vient maintenant la partie lente.

je finis à l'aide de ce (qui est tooooo lent):

  NSLog(@"Need people added to the league"); 
     for (person *tempPerson in peopeArrayDownloaded) { 
      NSPredicate *predicate = [NSPredicate predicateWithFormat:@"person_id = %@",tempPerson.person_id]; 
      // NSLog(@"Searching for existing person, person_id: %@",existingPerson.person_id); 
      NSArray *filteredArray = [peopleArrayExisting filteredArrayUsingPredicate:predicate]; 
      if ([filteredArray count] == 0) { 
       NSLog(@"Couldn't find an existing person in the downloaded file. Adding.."); 
       person *newPerson = [NSEntityDescription insertNewObjectForEntityForName:@"person" inManagedObjectContext:managedObjectContextPeople]; 

est-il un moyen de générer un nouveau tableau d'éléments d'index se référant aux éléments supplémentaires dans mon fichier téléchargé? Par ailleurs, sur mes tablesViews, j'utilise NSFetchedResultsController, ainsi les attributs de mise à jour appellent [cell setNeedsDisplay]; .. environ 60 fois par cellule, pas une bonne chose et il peut planter l'application.

Merci pour la lecture :)

+0

Remarque: Il est considéré comme incorrect d'avoir des arguments sans nom dans vos sélecteurs. – retainCount

+0

Merci pour le commentaire, j'apprends encore. Où est-ce que je fais ça? – iOSDevil

Répondre

3

Je commencerai par dire que je suis encore nouveau d'utiliser le framework Core Data, mais je pense que votre problème réside dans la boucle que vous avez posté. Si vous regardez votre boucle, chaque fois qu'elle s'exécute, elle crée un nouvel objet NSPredicate, puis filtre votre tableau existant à la recherche de correspondances. Sur un petit ensemble de données, cette technique fonctionnerait avec des pertes de performance apparemment minimes; Cependant, avec votre grand ensemble de données, vous passerez beaucoup de temps à créer des objets NSPredicate qui ne diffèrent que par le nom que vous avez fourni. Je suggérerais que vous regardiez comment créer un seul prédicat et ensuite utiliser la substitution de variable pour effectuer la recherche. Pour plus d'informations sur l'utilisation des variables dans les prédicats, consultez: http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/CoreData/Articles/cdImporting.html#//apple_ref/doc/uid/TP40003174

En note, vous pouvez également considérer comment vous avez trié vos données et comment vous effectuez l'opération de recherche. Et une autre chose que j'ai remarqué est que vous ne libérez pas votre objet NSPredicate, donc vous jetez simplement de la mémoire.

Questions connexes