2010-09-29 4 views
0

J'ai donc obtenu les entités Niveau et Carreau. Level a une relation avec Tile. La tuile a un 'index' de propriété.Puis-je utiliser des variables d'instance avec un objet NSManagedObject?

En ce moment je suis en utilisant ce code pour obtenir le tableau de tuiles de niveau trié:

- (NSArray *)sortedTiles 
{ 
    NSMutableArray *sortedTiles = [NSMutableArray arrayWithArray:[self.tiles allObjects]]; 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"index" ascending:YES]; 
    [sortedTiles sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 
    [sortDescriptor release]; 
    return sortedTiles; 
} 

Cela fonctionne, mais je veux être en mesure de récupérer une seule tuile avec un certain indice, donc j'écrit cette méthode Level.h:

- (Tile *)tileWithIndex:(NSInteger)index; 

La mise en œuvre est assez simple:

- (Tile *)tileWithIndex:(NSInteger)index 
{ 
    NSArray *sortedTiles = [self sortedTiles]; 
    Tile *tile = [sortedTiles objectAtIndex:index]; 
    return tile; 
} 

maintenant, Bien sûr, ce n'est pas la manière la plus efficace de le faire parce que le tableau de tuiles doit être alloué et trié à chaque fois, donc je pensais: si j'ajoute juste une variable d'instance à Level, 'sortedTiles', alors je n'aurai pas pour le reconstruire à chaque fois. Mais Level est une sous-classe de NSManagedObject, alors est-ce possible et/ou sage à faire?

+0

Veuillez formater correctement votre code. –

+0

Aimerait, mais ne peut pas le faire fonctionner. J'utilise 4 espaces avant certaines lignes pour mettre en retrait mais ça ne va pas indenter ... Edit: désolé, totalement mal compris la référence de mise en forme. Fixé. – Rits

Répondre

0

Je ne le ferais pas. Les NSManagedObjects sont le reflet d'un enregistrement dans la base de données et l'ajout de variables membres supplémentaires à l'extérieur du modèle me semble ajouter quelque chose qui n'appartient pas.

Il existe d'autres meilleures façons d'accomplir la même chose. Le plus simple serait d'obtenir le contrôleur ou le délégué qui récupère tous ces objets pour aller chercher, trier et conserver le tableau localement.

Pour les situations complexes ou de grande taille, vous pouvez utiliser un NSFetchRequestController pour collecter, trier et distribuer NSManagedObjects selon les besoins. Cela s'intègre bien dans un UITableViewController. Je n'ai pas effectué de tests de performances, mais pour une situation où il y a potentiellement un grand nombre d'enregistrements, je vais d'abord essayer de voir si la gestion du cache par les classes Fetch Results est suffisante.

+0

Je ne suis pas sûr que je suis d'accord que vous ne devriez pas ajouter iVars à une sous-classe NSManagedObject en général. Tant que ces iVars ne sont pas destinés à persister et que leurs accesseurs sont responsables de l'état isFault de l'instance, il existe de nombreuses utilisations valides et utiles. En ce qui concerne l'utilisation de l'OP, je ne suis pas sûr de bien comprendre la question, mais je "sens" que c'est exagéré. :-) –

+0

Pouvez-vous donner un exemple? J'ai du mal à en trouver un qui (1) n'est pas mieux stocké dans le contrôleur ou le délégué gérant l'application, la vue ou le cas d'utilisation, et (2) ne cause pas de problèmes quand il y a plusieurs NSManagedObjectContexts version de l'objet. –

+0

Le principal avantage de l'utilisation de la variable d'instance serait l'optimisation de la méthode 'tileWithIndex:' de Level. À l'heure actuelle, chaque fois que j'appelle cette méthode, triedTiles doit être reconstruit. Si je stocke les classedTiles dans une variable d'instance de Level, je peux simplement utiliser cette variable à chaque fois. – Rits

Questions connexes