2009-10-22 14 views
3

J'ai un fichier plist de paramètres par défaut dans le dossier des ressources de mon application et lors du premier lancement qui est copié dans le dossier des documents.Mise à jour et modification des paramètres des fichiers plist avec les nouvelles versions d'une application

Dans les versions successives de l'application, comment puis-je fusionner les paramètres de plist dans leurs documents avec de nouvelles clés & valeurs (éventuellement imbriquées) qui ont été ajoutées depuis la version précédente? J'ai vu un modèle où les propriétés sont réellement créées comme un NSDictionary dans l'application (avec tous les paramètres par défaut), puis les paramètres actuels enregistrés dans le fichier plist est fusionné avec ce dictionnaire, et qui est ensuite sauvegardé sur le plist actuel.

Est-ce une bonne approche? Si oui, comment allez-vous fusionner NSDictionary qui pourrait avoir plusieurs valeurs imbriquées avec sous-tableaux et sous-dictionnaires?

De même, est-il conseillé d'avoir un fichier plist personnalisé séparé pour les paramètres, ou devez-vous toujours utiliser NSUserDefaults? NSUserDefaults gère-t-il les versions et les modifications par défaut?

Un grand merci,

Mike

Répondre

1

D'accord, je pense que je suis venu avec la meilleure façon de le faire:

- (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

'pour (NSString * clé dans [currentSettings AllKeys]) 'pourrait être écrit comme' pour (clé NSString * dans currentSettings) '. 'if ([[self.settings allKeys] indexOfObject: clé]! = NSNotFound)' pourrait être écrit comme 'if ([self.settings objectForKey: key])' – user102008