Actualizando & amp; cambiar la configuración de archivos de listas con nuevas versiones de una aplicación

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

Pregunta

Tengo un archivo plist de configuración predeterminada en la carpeta de recursos de mi aplicación, y en el primer inicio que se copia en la carpeta de documentos.

En versiones sucesivas de la aplicación, ¿cómo puedo fusionar la configuración de plist en sus documentos con las nuevas teclas & amp; valores (posiblemente anidados) que se han agregado desde la versión anterior?

He visto un patrón en el que las propiedades se crean realmente como NSDictionary en la aplicación (con todas las configuraciones predeterminadas), y luego la configuración actual guardada en el archivo plist se fusiona con ese diccionario, y luego se guarda sobre el plist actual.

¿Es ese un buen enfoque? Si es así, ¿cómo se combinan los NSDictionary que podrían tener varios valores anidados con sub matrices y sub diccionarios?

Además, ¿se recomienda tener un archivo plist personalizado separado para la configuración, o debería usar siempre NSUserDefaults? ¿NSUserDefaults maneja el control de versiones y el cambio de valores predeterminados?

Muchas gracias

Mike

¿Fue útil?

Solución

Bien, creo que he encontrado la mejor manera de hacerlo:

- (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];
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top