تحديث وتغيير إعدادات ملفات بليست مع إصدارات جديدة من التطبيق

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

سؤال

ولقد حصلت على ملف بليست الإعدادات الافتراضية في المجلد موارد التطبيق الخاص بي، وعلى إطلاق الأول الذي يحصل على نسخ إلى مجلد المستندات.

في الإصدارات المتتابعة من التطبيق، كيف يمكنني دمج الإعدادات بليست في وثائقها مع أي من مفاتيح جديدة والقيم (ربما متداخلة) التي تم إضافتها منذ الإصدار السابق؟

ورأيت نمط حيث يتم إنشاء خصائص الواقع باعتباره NSDictionary في تطبيق (مع كافة الإعدادات الافتراضية)، ثم الإعدادات الحالية المحفوظة في ملف بليست يتم دمج مع هذا القاموس، والتي ثم حفظها على بليست الحالي.

هل هذا نهج جيد؟ إذا كان الأمر كذلك، كيف يمكنك أن تذهب نحو دمج في NSDictionary يمكن أن يكون لها العديد من القيم المتداخلة مع صفائف الفرعية والقواميس الفرعية؟

وكما هو نصح لديك ملف بليست مخصص منفصل عن الإعدادات، أو يجب عليك دائما استخدام 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