Question

Une question iPhone pour vous les gars! J'ai un NSURLConnection qui télécharge XML à partir d'un serveur et la traite dans un tableau qui fait partie d'un autre tableau. Je n'ai aucun moyen de savoir combien d'objets je besoin, donc je ne peux pas allouer un NSArray au préalable. Ma question est:

Serait-il préférable de créer le tableau de parent comme un NSArray au niveau de la classe et de l'affecter après que je stocke les données dans un NSMutableArray temporaire ou tout simplement faire le NSMutableArray au niveau de la classe? Il est intéressant de noter que je ne ai pas besoin de modifier le tableau autre que pour le libérer à la fin de l'exécution du programme.

Était-ce utile?

La solution

Je ne pense pas que ce qui importe vraiment.

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 suit: Vous auriez une propriété NSArray:

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

Ensuite, vous créez un NSMutableArray, chargez 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.

Autres conseils

Je pense que ce que vous voulez sans doute faire est de créer des classes qui correspondent à ce que vous représentez dans votre xml. Par exemple, si vous ressemble xml quelque chose comme 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é de la classe PeopleList a votre premier tableau qui contient un ou plusieurs objets personne. Les objets personne, à son tour, ont également des tableaux de tenir 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 de la personne de classe a aussi une autre propriété: « nom » 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 alloc'd, ma classe est responsable de la libération.

@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 réseau en cascade de. 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 faire un tage:

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

a possesion:

[currentPerson.possesion addObject: contentsOfCurrentElement];

ou le nom:

currentPerson.name = contentsOfCurrentElement;

Mais pour répondre à votre question plus précise, je ne stocke les données dans un NSArray temporaire, puis copier que dans un NSMutableArray. Il n'y a presque pas de gain de performance en le faisant, et vous brûlerez des cycles de CPU et de mémoire faire la copie.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top