Ändern Sie Objekte in NSUserDefaults ohne das Erstellen und Neueinstellung Kopien

stimmen
6

Ich habe Wörterbuch bekam gespeichert NSUserDefaultsund ich muss hinzufügen / entfernen Artikel in diesem Wörterbuch.

Es stört mir, dass dies ich wandelbar Kopie gesamten Wörterbuch erstellen zu tun habe, ein Element ändern und ganzen Wörterbuch mit neuer Kopie ersetzen.

copy = [[defaults objectForKey:@foo] mutableCopy];
[copy setObject:… forKey:@bar];
[defaults setObject:copy forKey:@foo];

und es geht noch mehr Kopieren und Wiedereinstellung für Objekte tiefer in der Hierarchie.

Gibt es einen besseren Weg?

Ich habe zu verwenden versucht , [defaults setValue:… forKeyPath:@foo.bar]aber das scheint nicht zu funktionieren (Objekt ist nicht änderbare).

Veröffentlicht am 14/08/2009 um 12:07
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
5

Ich schaffe in der Regel eine benutzerdefinierte Klasse alle meine Anwendungseinstellungen zu halten. Diese Klasse kann einmal änderbare Kopien der userDefaults laden, wenn das Programm startet, und dann behandeln alle inkrementellen auf dem Weg spart:

MyPreferences.h

@interface MyPreferences
{
   NSMutableDictionary allPrefs;
}
@property (readonly) NSMutableDictionary * allPrefs;
- (void)load;
- (void)save;
@end

MyPreferences.m

@implementation MyPreferences
@synthesize allPrefs;

- (id)init
{
    if ((self = [super init]) == nil) { return nil; }
    allPrefs = [[NSMutableDictionary alloc] initWithCapacity:0];
    return self;
}

- (void)dealloc
{
    [allPrefs release];
    [super dealloc];
}

- (void)load
{
    // load all mutable copies here
    [allPrefs setObject:[[defaults objectForKey:@"foo"] mutableCopy]
                 forKey:@"foo"];
    // ...
}

- (void)save
{
    [defaults setObject:allPrefs forKey:@"app_preferences"];
}

@end

Ich schaffe eine Instanz dieser Klasse in meiner Anwendung delegieren und dann nennen , [myPrefs load]wenn meine Anwendung startet. Alle Einstellungen geändert , während das Programm ausgeführt wird , kann geändert durch werden myPrefsund gespeichert dann durch den Aufruf [myPrefs save]nach Wunsch:

MyPreferences * myPrefs = [myApplication myPrefs];
[myPrefs setObject:bar forKeyPath:@"allPrefs.foo.bar"];
[myPrefs save];

Als zusätzlichen Bonus können Sie die Struktur der MyPreferencesKlasse, wie Sie möchten, die Vorteile der OO - Programmierung auf den gesamten Satz von Präferenzen zu bringen. Ich zeigte den einfachen Weg hier einfach ein veränderliches Wörterbuch, aber Sie können jede Präferenz in eine Immobilie machen, und für kompliziertere Objekte wie Pre / Post - Verarbeitung tun NSColor, zum Beispiel.

Beantwortet am 14/08/2009 um 13:08
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more