Frage

Ein iPhone Frage für euch! Ich habe eine NSURLConnection, die XML von einem Server herunterlädt und verarbeitet sie in ein Array, das ein Teil eines anderen Array ist. Ich habe keine Möglichkeit zu wissen, wie viele Objekte, die ich brauche, so kann ich eine NSArray vorher nicht zuordnen. Meine Frage lautet:

Wäre es besser, die übergeordnete Array als NSArray auf Klassenebene zu erstellen und verteilen es, nachdem ich die Daten in einem temporären NSMutableArray speichern oder einfach nur die NSMutableArray auf Klassenebene machen? Es ist erwähnenswert, dass ich nicht das Array ändern müssen anders als es der Programmablauf am Ende zu lösen.

War es hilfreich?

Lösung

Ich glaube nicht, es wirklich darauf ankommt.

Ich lese das Beginning iPhone 3 Entwicklungs-Buch zur Zeit, und in der Regel das Laden der Daten, wie dies geschehen ist: Sie würden eine NSArray Eigenschaft haben:

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

Dann erstellen Sie eine NSMutableArray, Ihre Daten laden und die Eigenschaft festgelegt:

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

listOfObjects würde dann als NSArray (unveränderlich) behandelt werden, obwohl es wäre eigentlich ein NSMutableArray sein.

Andere Tipps

Ich denke, was Sie wollen wahrscheinlich einige Klassen tun erstellen, die dem entsprechen, was Sie in Ihrem xml vertreten. Wenn Sie zum Beispiel xml etwa wie folgt aussehen:

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

Sie sollten eine PeopleList Klasse und eine Person Klasse haben. Ein Objekt instanziiert aus der PeopleList Klasse hat Ihre erste Array, das ein oder mehr Person-Objekte enthält. Die Person Objekte, die wiederum auch Arrays, die den Besitz (die in diesem Fall sind Strings - obwohl bei Bedarf sie Possesion Objekten sein könnten) halten In diesem Fall wird die Person Klasse des Beispiel zu helfen, hat auch eine andere Eigenschaft: ‚namen‘ das ist auch ein String.

Zum Beispiel:

@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

In der init-Methode ist diese Objekte müssen Sie / init die Arrays Alloc, so dass sie bereit sein wird, Objekte zu erhalten. Und weil ich alloc'd sie, meine Klasse ist für die Freigabe verantwortlich.

@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

Nun, da dies geschehen ist, können Sie Ihre Datenstruktur von Cascading Arrays einrichten. Wie Sie die XML parsen, wenn Sie über einen PeopleList Tag kommen tut ein:

currentPeopleList = [[PeopleList alloc] init];

und wenn Sie über eine Person kommen tage tun ein:

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

a Besitz:

[currentPerson.possesion addObject: contentsOfCurrentElement];

oder Name:

currentPerson.name = contentsOfCurrentElement;

Aber Ihre spezifischere Frage zu beantworten, ich speichere die Daten nicht in einem temporären NSArray und kopieren Sie dann, dass in eine NSMutableArray. Es gibt fast keinen Leistungsgewinn durch so tun, und Sie werden CPU-Zyklen und Speicher macht die Kopie brennen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top