2012-04-08 7 views
0

Ich weiß, dass es viele Themen mit ähnlichen Problemen gibt, aber ich konnte kein Thema zu meiner Frage finden.schreibe einen Plist in Ziel c

Ich möchte eine Reihe von Highscores speichern.
Jeder Eintrag von Highscores muss zwei Elemente haben
ein NSString * und ein int.

Ich möchte die Top 20 High Scores (Paare von Strings und Ints) speichern und das in einem Plist tun.

Ich beginne mit:

NSMutableArray *arr = [[NSMutableArray alloc] initWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"Mylist" ofType:@"plist"]]; 

ich das Element 0 des Arrays will ein Wörterbuch sein, wo ich Schlüsselwertepaare einfügen kann (string, int)
Wie mache ich das?

+1

Drei Kommentare: 1. Ist das Wurzelelement Ihres Plist wirklich ein Array? Ich bezweifle. Sie möchten lieber ein NSMutableDictionary für Ihren Zweck initialisieren. 2. Dann können Sie kein Objekt am Index 0 einfügen, da das Wörterbuch eine * ungeordnete * Sammlung ist. 3. Bevor Sie es in einer anderen Frage stellen: Sie werden NICHT in der Lage sein, den PLIST in das Hauptbündelverzeichnis der App umzuschreiben, da eine App möglicherweise nicht in ihr eigenes Bundle schreiben kann. –

+0

Auch wenn Sie NSMutableDictionary-Objekte in Ihrem Array speichern und speichern, sind sie beim Laden unveränderlich. ([NSArray-Klassenreferenz für initWithContentsOfFile] (https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html#//apple_ref/occ/instm/NSArray/ initWithContentsOfFile :) sagt "Die Objekte in diesem Array sind unveränderlich, auch wenn das Array veränderbar ist.") – Dondragmer

Antwort

1

Sie können immer [arr addObject:score]; nennen, sortieren sie und entfernen Sie das letzte Element, bis 10.

sind Um

zu sortieren:

[arr sortUsingComparator:^(id firstObject, id secondObject) { 
    NSDictionary *firstDict = (NSDictionary *)firstObject; 
    NSDictionary *secondDict = (NSDictionary *)secondObject; 
    int firstScore = [[firstDict objectForKey:@"score"] intValue]; 
    int secondScore = [[secondDict objectForKey:@"score"] intValue]; 
    return firstScore < secondScore ? NSOrderedAscending : firstScore > secondScore : NSOrderedDescending : NSOrderedSame; 
}]; 

Wenn Sie die Noten wollen um die andere Art und Weise zu sein, ändern Sie das ‚>‘ auf ‚<‘ und umgekehrt. Um die Liste auf 10 zu halten:

Sie müssen möglicherweise sortieren, wenn Sie von Ihrem PLIST laden. Für 10 Punkte wird der Performance-Hit minimal sein, also schlage ich vor, dass du es nur für den Fall tust.

+0

Das ist in der Tat hilfreich! Aber das Problem ist, ich möchte sowohl eine Partitur als auch eine Saite für jede Partitur speichern sagen, dass der Schlüssel der String sein sollte und dann sollte der Wert des Schlüssels die Punktzahl sein? –

0
[arr insertObject:[NSMutableDictionary dictionary] atIndex:0]; 
+0

Zuerst, danke für den Kommentar. Zweitens, etwas zu klären. Mein Ziel ist es, in einem Plist zu speichern, auf jeden Fall bin ich mir nicht sicher, wie (ich denke die oben beschriebene Weise) die 10 Top High Scores (ihre Details bilden ein Paar von einem int und NSString *. Jedes Mal wenn ich will um zu überprüfen, ob ich das int bin ich einfügen ist höher als die 10 ints bereits dort und wenn ja, einfügen und entfernen Sie die minimale int (wenn sie mehr als 10 insgesamt sind.) Ist das klarer? –

1

Property List Serialization

Sie wollen zur Kenntnis machen: die Veränderlichkeit Option, als Methode wahrscheinlich unveränderliche Arrays zurückgibt ...

in einer plist Speicherung mit den writeToFile:... oder writeToURL:... Methoden erfolgen

+0

auch es ist in der regel sehr schlechte praxis Die Wurzel eines Plists als Array zu haben, es sei denn, es ist nicht deterministisch in Bezug auf die Reihenfolge. –