3

アプリのリソース フォルダーにデフォルト設定の plist ファイルがあり、最初の起動時にドキュメント フォルダーにコピーされます。

アプリの後続のバージョンで、ドキュメントの plist 設定を、以前のバージョン以降に追加された新しいキーと値 (ネストされている可能性があります) とマージするにはどうすればよいですか?

プロパティが実際にアプリで NSDictionary として作成され (すべて既定の設定)、plist ファイルに保存されている現在の設定がそのディクショナリとマージされ、現在の plist に保存されるパターンを見てきました。

それは良いアプローチですか?もしそうなら、いくつかのネストされた値を持つ可能性のある NSDictionary をサブ配列とサブ辞書とどのようにマージしますか?

また、設定用に個別のカスタム plist ファイルを用意することをお勧めしますか、それとも常に NSUserDefaults を使用する必要がありますか? NSUserDefaults はバージョン管理とデフォルトの変更を処理しますか?

どうもありがとう、

マイク

4

1 に答える 1

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];
    }
}
于 2009-10-25T13:50:14.307 に答える