2009-06-25 11 views
6

Ich bin verwirrt über NSUserDefaults auf dem iPhone.Gibt es eine bessere Möglichkeit, eine Menge Sachen in NSUserDefaults zu setzen?

Ich komme aus einem C/asm-Hintergrund und das Objective-C-Zeug war eine Lernerfahrung.

Ich verwende derzeit NSUserDefaults, um einige Zeichenfolgen (für die Namen in einer Highscore-Tabelle) zu speichern. Ich möchte damit beginnen, eine Funktion vom Typ "Spiel speichern" zu implementieren. Wenn der Benutzer also einen Anruf erhält oder für einen Moment aus dem Spiel aussteigt, kann er wieder darauf zugreifen.

Um das Spiel wiederherzustellen, habe ich ein paar BOOL Flags, ein paar int s, um einige notwendige Variablen zu speichern, aber ich bin bei einem Array stecken ich muss speichern.

Ich habe ein 50-Element-Array von unsigned char s. Ich könnte es zu int s verschieben, wenn es die Dinge einfacher machen würde, aber ich sehe es einfach nicht.

Um mit NSUserDefaults arbeiten kann ich setBool (bereits das zu tun), setFloat (auch hier schon das zu tun), setInteger und setObject.

Offensichtlich konnte ich Schlüssel für jedes Element des Arrays und speichern sie eins nach dem anderen mit setInteger, aber das ist wirklich kludgy. Was ist der beste Weg, um dies anzugehen? Statt eines Arrays von unsigned char s versuche ich irgendwie, einen NSObject zu verwenden? Gibt es irgendwelche guten Tutorials auf NSObject s, die ich durchlesen kann, um es besser zu verstehen?

Antwort

5

Würden die Eigenschaftenlisten besser zu dem passen, was Sie erreichen möchten?

Sie können ein Wörterbuch erstellen, Wert für jede Einstellung oder ein Array speichern und dann in die Eigenschaftsliste ausgeben. Sie können sie einfach zurücklesen oder die Werte basierend auf Schlüsseln aktualisieren.

http://developer.apple.com/documentation/Cocoa/Conceptual/PropertyLists/...

+1

Ja, normalerweise würden Sie NSUserDefaults für Voreinstellungen verwenden (z. B. imperiale vs metrische Einheiten wählen) und die Daten Ihrer App in einer separaten Datei mit serialisierten Eigenschaftenlisten, sqlite, Core Data usw. speichern. –

+0

Einverstanden, Benutzervorgaben sind Prefs, aber Daten sollten woanders gespeichert werden, wie zum Beispiel in "~/Library/Application Support/MyApp /". –

+0

Auf dem iPhone gibt es offensichtlich verschiedene Konventionen zum Speichern von Daten, da die Struktur sehr unterschiedlich ist. Weitere Informationen zum Speichern von Dateien für Ihre App finden Sie in den entsprechenden iPhone-Programmierhandbüchern. –

2

Sie können eine NSArray oder eine NSDictionary-NSUserDefaults mit setObject:forKey: passieren. Es funktioniert gut. Offensichtlich müsste Ihr Array von unsignierten Zeichen ein NSArray von NSNumbers werden, was einige Overhead bedeutet, aber es ist wahrscheinlich Ihre einfachste Option.

1

Versuchen Sie, ein NSData-Objekt, das direkt an NSUserDefaults gespeichert werden können

[[NSUserDefaults standardUserDefaults] setObject:[NSData dataWithBytes:array length:len] 
              forKey:@"someArray"]; 
0

es Whoa, sollten Sie wirklich sehen Core Data in (oder nur SQLLite) Spielzustand zu speichern. NSUserDefaults ist für das, was sagt - Standardeinstellungen, Konfigurationseinstellungen. Es ist nicht wirklich gedacht, größere Binärdaten zu speichern.

0

Um ein 50-Element C-Array von unsigned chars in zu einem NSArray wandeln, die Sie in einem NSUserDefaults mit speichern:

NSMutableArray* a = [NSMutableArray new]; 
for (int i = 0; i < 50; ++i) { 
    [a addObject:[NSNumber numberWithInteger:yourArray[i]]]; 
} 
[[NSUserDefaults standardUserDefaults] setObject:a forKey:@"theArray"]; 
[a release]; 

ihn zurückzubekommen:

NSArray* a = [[NSUserDefaults standardUserDefaults] objectForKey:@"theArray"]; 
for (int i = 0; i < 50; ++i) { 
    yourArray[i] = [[a objectAtIndex:i] integerValue]; 
} 

Es ist sicherlich kein Problem mit NSUserDefaults, um deinen Spielstatus zu speichern, nicht wenn es so klein ist. Wenn Ihr Spielzustand humorvoll ist, möchten Sie vielleicht untersuchen, ob er als Plist-Datei gespeichert ist, aber NSUserDefaults wird sich nicht damit abfinden, diese triviale Menge an Daten zu verarbeiten.

+0

Vielen Dank für den Code und die Empfehlung. Ich versuche es mal. – K2Digital

Verwandte Themen