Обновление и изменение файлов списка настроек с новыми версиями приложения

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

Вопрос

У меня есть файл plist настроек по умолчанию в папке ресурсов моего приложения, и при первом запуске он копируется в папку documents.

В последующих версиях приложения, как я могу объединить настройки plist в их документах с любыми новыми ключами и значениями (возможно, вложенными), которые были добавлены с предыдущей версии?

Я видел шаблон, в котором свойства фактически создаются как NSDictionary в приложении (со всеми настройками по умолчанию), а затем текущие настройки, сохраненные в файле plist, объединяются с этим словарем, и затем он сохраняется поверх текущего plist.

Это хороший подход?Если да, то как вы собираетесь объединить NSDictionary, которые могут иметь несколько вложенных значений, с подмассивами и вложенными словарями?

Кроме того, рекомендуется ли иметь отдельный пользовательский файл plist для настроек, или вы всегда должны использовать NSUserDefaults?Обрабатывает ли NSUserDefaults управление версиями и изменение значений по умолчанию?

Большое спасибо,

Майк

Это было полезно?

Решение

Хорошо, я думаю, что придумал лучший способ сделать это:

- (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];
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top