inconsistant defaults (NSUserDefaults) Verhalten im iPhone-simulator Standardwerte

StackOverflow https://stackoverflow.com/questions/475367

  •  19-08-2019
  •  | 
  •  

Frage

Ich habe mit sehr inkonsistente Ergebnisse bei der Entwicklung einer iPhone-app und versuchen, speichern der Einstellungen über die standard NSUserDefaults-Mechanismus.Ich bin mit code, fast straight out of the iPhone Developer ' s Cookbook, die von der Firma Sadun, Erica (fantastisches Buch, btw), es sieht aus wie diese:

(void) updateDefaults
{
    NSMutableArray *spells =  [[NSMutableArray alloc] init];
    NSMutableArray *locs = [[NSMutableArray alloc] init];

    for (DragView *dv in [boardView subviews]) 
    {
        [spells addObject:[dv whichSpell]];
        [locs addObject:NSStringFromCGRect([dv frame])]; 
    }

    [[NSUserDefaults standardUserDefaults] setObject:spells forKey:@"spells"];
    [[NSUserDefaults standardUserDefaults] setObject:locs forKey:@"locs"];
    [[NSUserDefaults standardUserDefaults] synchronize];

    [spells release];
    [locs release];
}

Die Werte werden gespeichert, manchmal...und restauriert, manchmal.Ich kann nicht genau Perle auf das, was funktioniert oder nicht machen es Arbeit.

Hat jemand ähnliche Erfahrungen?Irgendwelche Vorschläge, was könnte damit es funktioniert?Die synchronize-Methode der beste Weg, um zu erzwingen, eine Festplatte schreiben und die Werte zu speichern, oder ist es etwas besser (sowohl für die Produktion als gut als simulator).

Vielen Dank Ryan

War es hilfreich?

Lösung

Sie sollten eine NSKeyedArchiver für das Speichern Ihrer Arrays verwenden, wie zum Beispiel:

[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:spells] forKey:@"spells"];
[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:locs] forKey:@"locs"];
[[NSUserDefaults standardUserDefaults] synchronize];

Sie sollten auch Ihre Zauber-Klasse implementiert die NSCoding Protokoll (encodeWithCoder sicher: und initWithCoder :), wenn es sich um eine benutzerdefinierte Klasse ist. Es sieht aus wie Ihre locs NSStrings sind, die gerade fein archiviert wird.

Sie werden auch so etwas wie

tun müssen
NSData *dataRepresentingSavedSpells = [currentDefaults objectForKey:@"spells"];
if (dataRepresentingSavedSpells != nil)
{
    NSArray *oldSpells = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedSpells];
}

Um die alten Werte von den Standardeinstellungen zu laden.

ich synchronisieren verwenden, um Datenträger auf Ausgang zu schreiben, und es war in meiner Erfahrung sehr zuverlässig.

Andere Tipps

Auf Mac OS X und vermutlich auch auf das iPhone-Betriebssystem, die standardmäßig Datenbank kann nur die property-Liste Objekte:NSString, NSNumber, NSArray, NSDictionary, und NSData.

Es ist nicht klar, aus Ihrem code-snippet geben, was ein Zauber ist, aber wenn es ist nicht einer der oben, es wird nicht gespeichert in der Standardeinstellung Datenbank.Ihre Optionen sind:

  1. Schreiben Sie eine Methode, die wird konvertieren Sie Ihre widersprechen und aus einer plist-Darstellung.In anderen Worten, eine Methode zu erstellen, die ein NSDictionary von Ihrem Objekt und eine andere Methode zum initialisieren des Objekts mit einem NSDictionary.Sie können auch wählen, um es zu speichern wie ein NSArray oder NSString.
  2. Machen Sie Ihr Objekt implementieren, das NSCoding-Protokoll, und dann verwendet, NSKeyedArchiver konvertieren Sie das Objekt in ein NSData-Objekt, und NSKeyedUnarchiver zu konvertieren zurück.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top