2010-08-29 3 views
0

J'ai un modèle CoreData dans mon application iPhone, qui est lié à une base de données SQL contenant plus de 50 000 enregistrements. Lorsque je génère les classes d'enregistrements, Xcode utilise la directive @dynamic pour les propriétés. J'ai une propriété nommée "ISFAV", type NSNumber (CoreData n'utilise pas BOOL ou Integer, il utilise des types d'objet). Être bref, je change la propriété ISFAV lorsque l'utilisateur tape sur un bouton de cette façon:Propriétés iPhone CoreData: les modifications apportées à managedObjects sont trop lentes

if (![record.ISFAV intValue]) 

record.ISFAV = [NSNumber numberWithInt: 1];

sinon enregistrement.ISFAV = [N ° NSNumberIntérieur: 0];

Assez simple. Mais si j'essaie de taper plusieurs fois sur le même bouton séquentiellement, l'iPhone prend trop de temps (le bouton reste en attente pendant un temps qui augmente progressivement). Cela se produit même si je change d'enregistrement, en ajoutant séquentiellement de nombreux enregistrements des favoris (au lieu d'ajouter \ supprimer le même enregistrement des favoris).

Si je change la méthode d'accesseur d'origine à @synthesize, le problème semble être résolu.

Est-il correct d'utiliser la directive synthesize pour les méthodes d'accès dans CoreData?

Merci beaucoup!

@EDIT Utilisation de la directive synthétisent, aucune modification ne sont apportées au modèle CoreData lorsque j'enregistre le contexte: - \ Le problème est toujours non résolu: - \

+0

avez-vous déjà trouvé quel était votre problème? Je traite aussi un grand nombre d'entités et de relations, et la définition d'un simple attribut BOOL verrouille l'interface utilisateur pendant environ une demi-seconde, ce qui est inacceptable. Passer à l'attribut @synthesize accélère les choses comme vous l'avez dit, mais ce n'est pas une solution du tout. J'aimerais entendre si vous avez eu de la chance avec ça? – Rog

Répondre

0

@dynamic est un drapeau qui indique juste le compilateur la méthode existera au moment de l'exécution et ne l'avertira pas maintenant. Vous ne devez pas utiliser @synthesize avec les propriétés de données de base. Comment connaissez-vous votre point d'accès avec la définition de la propriété Données de base? Avez-vous profilé le code? Dans mon expérience, changer un attribut dans les données de base ne va pas être lent, il sera 1/1000e de seconde ou plus rapide. Enregistrez-vous sur le disque chaque fois que vous modifiez cette propriété? Est-ce que vous faites quelque chose d'autre dans l'appel?

Je voudrais profiler le code d'abord et trouver où le hotspot est vraiment. Utilisez les instruments et confirmez.

Questions connexes