J'optimise ma première application iOS avant qu'elle n'atteigne le magasin et je remarque les méthodes qui prennent apparemment beaucoup de temps. J'ai une application maître-détail assez simple où les entités du Core Data SQLite sont affichées dans un UITableView
, puis en tapant sur un ouvre une vue détaillée où l'utilisateur peut marquer comme favori (en plaçant un drapeau BOOL
dans cet objet à YES
. dès qu'ils ont atteint leur bouton favori, je l'appelle [NSManagedObjectContext save]
pour assurer leurs changements sont immédiatement, et en cas d'imprévu résilier, etc.Performance de la méthode Save de NSManagedObjectContext
Cette opération save
prend actuellement environ 205ms lors du test sur mon iPhone 4S. Il sont environ 4 500 entrées dans la base de données, chacune avec quelques chaînes, et quelques valeurs booléennes (enveloppé dans NSNumber
s)
Première question: devrait-il prendre 200ms pour faire ce changement? Je ne fais que définir une valeur booléenne, puis enregistrer le contexte, mais je n'ai jamais utilisé de données de base avant, donc je ne sais pas si c'est à peu près normal.
Deuxième question: le code que j'utilise est ci-dessous - est-ce que je fais quelque chose de mal dans le code pour que la méthode prenne autant de temps à s'exécuter?
- (IBAction) makeFavorite: (id) sender
{
[self.delegate detailViewControllerDidMakeFavorite];
[_selectedLine setIsLiked: [NSNumber numberWithBool: YES]];
[_selectedLine setIsDisliked: [NSNumber numberWithBool: NO]];
NSError *error;
if (![[[CDManager sharedManager] managedObjectContext] save:&error]) NSLog(@"Saving changes failed: %@, %@", error, [error userInfo]);
}
Peut-être que je me inquiète pour rien (je suis encore relativement nouveau programmeur), mais sur une note plus large, 200ms me suffit pour au moins essayer de résoudre ce problème, non? :)
J'ai regardé autour de tutoriels sur le sujet, mais n'a trouvé essentiellement rien, il semble qu'il est principalement conçu pour iCloud, que je n'utilise pas. Il semble que ce soit pour créer un document, mais je tire juste une seule entité d'une base de données Core Data SQLite, je n'ai aucun document en soi. Je ne suis pas sûr de savoir comment cela se rattache à ce que je fais du tout, j'en ai peur. – Luke
UIManagedDocument n'est pas seulement pour iCloud. Il fournit une pile de données de base «préconstruite»: MOC principal avec un parent MOC privé s'exécutant sur un thread d'arrière-plan. –
Je n'ai aucune idée de ce qu'est un MOC, ce commentaire était bien au-dessus de ma tête. Je n'ai pas réussi à trouver de documentation ou de tutoriels qui ne soient pas déroutants - faudrait-il réécrire tout mon code Core Data pour l'implémenter? – Luke