2009-07-17 5 views
0

Une question iPhone pour vous les gars! J'ai un NSURLConnection qui télécharge XML à partir d'un serveur et le traite dans un tableau qui fait partie d'un autre tableau. Je n'ai aucun moyen de connaître le nombre d'objets dont j'ai besoin, donc je ne peux pas allouer un NSArray à l'avance. Ma question est:Besoin de stocker un tableau d'un tableau d'objets de classe dans View Controller

Serait-il préférable de créer le tableau parent en tant que NSArray au niveau de la classe et l'allouer après avoir stocké les données dans un NSMutableArray temporaire ou juste faire le NSMutableArray au niveau de la classe? Il est à noter que je n'ai pas besoin de modifier le tableau autre que de le libérer à la fin du programme.

Répondre

1

Je ne pense pas que ce soit vraiment important.

Je lis le livre Beginning iPhone 3 de développement pour le moment, et le chargement en général les données se fait comme ceci: Vous auriez une propriété NSArray:

@interface 
{ 
... 
    NSArray *listOfObjects; 
... 
} 
@property (nonatomic, retain) NSArray *listObObjects; 
... 

Ensuite, vous créez un NSMutableArray, charger vos données et définissez la propriété:

NSMutableArray *array = [[NSMutableArray alloc] init]; // ? 
// load the XML into array here 
... 
self.listOfObjects = array; 
[array release]; 

listOfObjects seraient alors traités comme un NSArray (immuable) bien qu'il serait en fait un NSMutableArray.

0

Je pense que ce que vous voulez probablement faire est de créer des classes qui correspondent à ce que vous représentez dans votre fichier XML. Par exemple, si vous xml ressemble à ceci:

<peopleList> 
    <person> 
    <name>Joe</name> 
    <possession>Shovel</possession> 
    </person> 
    <person> 
    <name>Sam</name> 
    <possession>Shovel</possession> 
    <possession>Fork</possession> 
    <possession>Backpack</possession> 
    </person> 
</peopleList> 

Vous devriez avoir une classe PeopleList et une personne de classe. Un objet instancié à partir de la classe PeopleList a votre premier tableau qui contient un ou plusieurs objets Person. Les objets Person, à leur tour, ont aussi des tableaux pour contenir les possesions (qui dans ce cas sont des chaînes - bien que si nécessaire ils pourraient être des objets Possesion) Dans ce cas, pour aider l'exemple la classe Person a aussi une autre propriété: qui est aussi une chaîne.

Par exemple:

@interface PeopleList { 
    NSMutableArray *persons; // An array to store the Person objects 
} 
@property (nonatomic, retain) NSMutableArray *persons;  
@end 



@interface Person { 
    NSString *name; 
    NSMutableArray *possesions; //An array to store this Person's possesion strings 
} 
@property (nonatomic, retain) NSString *name; 
@property (nonatomic, retain) NSMutableArray *possesions; 
@end 

Dans la méthode de init ces objets que vous aurez à alloc/init les tableaux afin qu'ils soient prêts à recevoir des objets. Et parce que je les ai alloués, ma classe est responsable de la sortie.

@implementation PeopleList 
    -(id) init { 
     if (self = [super init]) { 
      persons = [[NSMutableArray alloc] init]; 
     } 
    } 

    -(void) dealloc { 
     [persons release]; 
     [super dealloc]; 
    } 
@end 


@implementation PeopleList 
    -(id) init { 
     if (self = [super init]) { 
      possesions = [[NSMutableArray alloc] init]; 
     } 
    } 

    -(void) dealloc { 
     [possesions release]; 
     [super dealloc]; 
    } 
@end 

Maintenant que cela est fait, vous pouvez configurer votre structure de données de tableaux en cascade. Comme vous analysez le fichier XML lorsque vous tombez sur un PeopleList Tag faire:

currentPeopleList = [[PeopleList alloc] init]; 

et quand vous tombez sur une personne tage faire un:

currentPerson = [[Person alloc] init]; 
[peopleList.persons addObject: person]; 

un possesion:

[currentPerson.possesion addObject: contentsOfCurrentElement]; 

ou nom:

currentPerson.name = contentsOfCurrentElement; 

Mais pour répondre à votre question plus spécifique, je ne stocke pas les données dans un NSArray temporaire, puis copiez cela dans un NSMutableArray. Il n'y a presque aucun gain de performance en faisant ainsi, et vous brûlerez des cycles de cpu et la mémoire faisant la copie.

Questions connexes