2009-10-22 5 views
3

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

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

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

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

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

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

Майк

ответ

1

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

- (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]; 
    } 
} 
+0

'для (NSString * ключ в [currentSettings AllKeys]) 'может быть записано как' for (ключ NSString * в currentSettings) '. 'if ([[self.settings allKeys] indexOfObject: key]! = NSNotFound)' может быть записано как 'if ([self.settings objectForKey: key])' – user102008

Смежные вопросы