Самый эффективный альтернативный метод хранения настроек для приложений iPhone

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

У меня хорошее количество настроек (из того, что я прочитал, вероятно, слишком много для NSUserDefaults), и два основных варианта, которые я рассматриваю, это: 1) сохранение настроек в словаре в plist, загрузка настроек в свойство NSDictionary в делегате приложения и доступ к ним через sharedDelegate 2) сохранение настроек в сущности Core Data (1 строка в сущности Settings), загрузка настроек в объект Settings в делегате приложения и доступ к ним через sharedDelegate

Какой из этих двух методов будет оптимальным с точки зрения производительности?


person SAHM    schedule 22.03.2012    source источник
comment
Слишком много для NSDefaults? Если у вас есть тысяча ключей, то, наверное, да. Но тогда вы неправильно делаете настройки.   -  person Costique    schedule 22.03.2012
comment
Если вы не хотите использовать NSUserDefaults с большим количеством настроек, почему бы не создать объект, который содержит все настройки, привести его в соответствие с протоколом NSCoding, сохранить его при завершении / выходе из активного приложения и загрузить его в приложение didFinishLaunching?   -  person bennythemink    schedule 22.03.2012
comment
Если вы храните много данных, забудьте обо всех случаях использования _1 _ !! 1111one-Answers, которые вы видели в stackoverflow. В любом случае они обычно ошибаются. Только не вызывайте синхронизацию после каждого setObject:forKey:, и у вас не будет проблем.   -  person Matthias Bauch    schedule 22.03.2012


Ответы (2)


Просто используйте NSUserDefaults, вот для чего он нужен. Почему вы чувствуете, что у вас слишком много для этого?

Кроме того, если вы решите использовать пакет настроек позже, вам все равно нужно будет использовать NSUserDefaults.

person sosborn    schedule 22.03.2012
comment
Действительно ли это намного лучше с точки зрения производительности, чем два вышеупомянутых варианта? Есть ли случай (или количество настроек), в котором одно из двух было бы лучше? Я довольно много читал эти доски, и я думаю, что видел что-то от Маркуса Зарры, который говорил, что иногда сохранение настроек в Core Data было более оптимальным, но я не знаю, в каком потоке это было ( и я не думаю, что он объяснил когда это было оптимальнее) - person SAHM; 22.03.2012
comment
Я действительно не вижу ситуации, когда вы бы достаточно обращались к настройкам по умолчанию, чтобы прирост производительности был заметен. Кроме того, NSUserDefaults в любом случае - это просто список, вы в конечном итоге реализуете что-то, что уже существует. - person sosborn; 22.03.2012

Вы должны использовать только NSUserDefaults. Если вы думаете, что существует много NSUserDefaults, я предлагаю вам создать 1 класс модели и следовать ему. Создать один класс модели и иметь свои настройки как свойства и создать объект этого класса и сохранить его в NSUserDefaults будет легко для вас, поскольку это только одноразовая реализация.

@interface SettingsModelClass : NSObject 
{
    NSString *strSetting1;
    BOOL boolSetting2;
}

@property (nonatomic,retain) NSString *strSetting1;
@property (nonatomic,assign) BOOL boolSetting2;

// Реализация

@implementation SettingsModelClass

@synthesize strSetting1, boolSetting2;

-(void)dealloc
{
    [strSetting1 release];
    [super dealloc];
}

- (void)encodeWithCoder:(NSCoder *)encoder
{
    //Encode properties, other class variables, etc
    [encoder encodeObject:self.strSetting1 forKey:@"StringSetting"];    
    [encoder encodeBool:self.boolSetting2 forKey:@"BoolSetting"];
}

- (id)initWithCoder:(NSCoder *)decoder
{
    self = [super init];
    if( self != nil )
    {
        //decode properties, other class vars
        self.strSetting1 = [decoder decodeObjectForKey:@"StringSetting"]; 
        self.boolSetting2 = [decoder decodeBoolForKey:@"BoolSetting"]; 
    }
    return self;
}

@end

Пожалуйста, оставляйте комментарии, если у вас есть сомнения. Я с радостью вам помогу.

Обновить. Да, вы можете получить доступ через делегата приложения. Или даже вы можете создать его как экземпляр класса singleton. В этом подходе используются средства OOPS, поэтому, как я считаю, лучше следовать этому шаблону.

person Janak Nirmal    schedule 22.03.2012
comment
Это выглядит великолепно - в какой момент (т.е. сколько настроек) этот метод становится более выгодным по сравнению с использованием простых NSUserDefaults? - person SAHM; 22.03.2012
comment
Кроме того, могу ли я загрузить настройки в объект SettingsModelClass в делегате приложения и получить к ним доступ через sharedDelegate во всем приложении? Если нет, как мне загрузить / получить доступ к настройкам в различных контроллерах представления во всем приложении? - person SAHM; 22.03.2012
comment
Спасибо, но будет ли это медленнее, чем прямое использование NSUserDefaults? - person SAHM; 22.03.2012
comment
Спасибо за информацию; это то, что я хотел бы попробовать в будущем; пока я решил просто использовать NSUserDefaults напрямую - person SAHM; 29.03.2012