Frage

Ich habe eine Standardeinstellungen plist-Datei in den Ordner Ressourcen meiner App bekam, und auf dem ersten Start, die in den Ordner Dokumente kopiert wird.

In aufeinanderfolgenden Versionen der App, wie kann ich die plist-Einstellungen in ihren Dokumenten mit neuen Schlüsseln und Werten (möglicherweise verschachtelt), die hinzugefügt wurden seit der letzten Version zusammenführen?

Ich habe ein Muster gesehen, wo Eigenschaften tatsächlich als NSDictionary in der App (mit allen Standardeinstellung) erstellt und dann in der plist-Datei gespeichert wird die aktuellen Einstellungen werden mit dem Wörterbuch verschmolzen, und das wird dann über die gespeicherte Strom plist.

Ist das ein guter Ansatz? Wenn ja, wie gehen Sie über NSDictionary die Zusammenführung, die mehrere verschachtelte Werte mit Subarrays und Unter Wörterbücher haben könnte?

Außerdem ist es eine separate benutzerdefinierte plist-Datei für Einstellungen, oder sollten Sie immer NSUserDefaults haben beraten? Hat NSUserDefaults Griff Versionierung und Ändern Standardwerte?

Vielen Dank,

Mike

War es hilfreich?

Lösung

Okay, ich glaube, ich habe den besten Weg gefunden, es zu tun:

- (void)readSettings {

    // Get Paths
    NSString *defaultSettingsPath = [[NSBundle mainBundle] pathForResource:@"DefaultSettings" ofType:@"plist"];
    NSString *settingsPath = [self.applicationDocumentsPath stringByAppendingPathComponent:@"Settings.plist"];

    // Read in Default settings
    self.settings = [NSMutableDictionary dictionaryWithContentsOfFile:defaultSettingsPath];

    // Read in Current settings and merge
    NSDictionary *currentSettings = [NSDictionary dictionaryWithContentsOfFile:settingsPath];
    for (NSString *key in [currentSettings allKeys]) {
        if ([[self.settings allKeys] indexOfObject:key] != NSNotFound) {
            if (![[currentSettings objectForKey:key] isEqual:[self.settings objectForKey:key]]) {

                // Different so merge
                [self.settings setObject:[currentSettings objectForKey:key] forKey:key];

            }
        }
    }

}

- (void)saveSettings {
    if (self.settings) {
        NSString *settingsPath = [self.applicationDocumentsPath stringByAppendingPathComponent:@"Settings.plist"];
        [self.settings writeToFile:settingsPath atomically:YES];
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top