2016-10-22 4 views
2

Я изучал некоторые учебники по хранению пользовательских объектов в NSUserDefaults. Я не могу понять, какой из них лучше подходит и/или преимущества в отношении сохранения вашей модели после ее преобразования в NSDictionary и хранения словаря с использованием NSKeyedArchiver для хранения объекта в NSUserDefaults. По моему мнению, вам нужно будет установить методы encodeWithCoder и initWithCoder, которые позволят вам устанавливать значения для разных ключей и в основном конвертировать все в NSData. Преобразование модели обратно в NSDictionary также выполнит те же шаги.Хранение пользовательских объектов как NSDictionary vs NSData

Каковы преимущества использования одного подхода по сравнению с другим или если один подход может привести к чему-то сломать?

Использование NSKeyedArchiver будет делать что-то вроде:

- (void)encodeWithCoder:(NSCoder *)encoder { 
    [encoder encodeObject:self.test forKey:@"string"]; 
    [encoder encodeObject:self.surname forKey:@"surname"]; 
} 

и преобразования модели обратно в NSDictioanry:

-(NSDictionary *)dictionaryWithModel:(Model *)model{ 

    NSDictionary *dictionary = @{ 
           @"dict":[model.innerModel dictionaryWithModel:model.innerModel], 
           @"string":self.test 
           }; 

    return dictionary; 
} 

В принципе, какой из будет лучше при хранении объекта в NSUserDefaults?

Edit: Так согласно документу, связанного в ответ, мы должны использовать NSDictionary для хранения объектов в NSUserDefaults (лучше производительность), то почему яблоко рекомендуется использовать NSKeyedArchiver?

+0

Посмотрите на моей Lib: https://github.com/alexburtnik/SettingsBox Это позволяет сохранять пользовательские объекты, а также все общие объекты фонда и примитивы NSUserDefaults всего за несколько строк кода. – alexburtnik

ответ

0

Here - это мой ответ на другой аналогичный вопрос.

Вы можете установить объект, как это:

NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults]; 
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:savingbean]; 
[currentDefaults setObject:data forKey:@"DATA"]; 
[currentDefaults synchronize]; 

и для объекта ПОЛУЧИТЬ так:

NSData *data = [currentDefaults objectForKey:@"DATA"]; 
SavingBean *token = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

Для пользовательского класса вы должны изменить эти методы в вас классе компоненты:

- (void)encodeWithCoder:(NSCoder *)encoder 
{ 
    [encoder encodeObject:[email protected]"":self.userName forKey: @"userName"]; 
    [encoder encodeObject:[email protected]"":self.passWord forKey: @"passWord"]; 
} 

-(id)initWithCoder:(NSCoder *)decoder 
{ 
    self = [super init]; 
    if(self) 
    { 
     self.userName = [decoder decodeObjectForKey: @"userName"]; 
     self.passWord = [decoder decodeObjectForKey: @"passWord"]; 
    } 
    return self; 
} 

Here самый проголосовавший подобный ответ. Вы также можете получить хорошие вещи оттуда.

Вы также можете использовать JSON Accelerator для создания класса bean. Это очень простой и мощный инструмент.

EDIT:

Класс NSUserDefaults предоставляет удобные методы для доступа к распространенных типов, таких как поплавки, удваивается, целые числа, булевы и URL. Объектом по умолчанию должен быть список свойств, то есть экземпляр (или для коллекций - комбинация экземпляров): NSData, NSString, NSNumber, NSDate, NSArray или NSDictionary. Если вы хотите сохранить какой-либо объект типа , его обычно необходимо архивировать для создания экземпляра NSData .

Значения, возвращаемые из NSUserDefaults, неизменяемы, даже если в качестве значения задан изменяемый объект .Например, если вы установите изменяемую строку как значение для «MyStringDefault», строка, которую вы позже получите , используя stringForKey: будет неизменной.

Примечание: система по умолчанию, по которой вы программным путем получаете доступ к через класс NSUserDefaults, использует списки свойств для хранения объектов , представляющих пользовательские настройки. Это ограничение, по-видимому, исключает множество объектов, таких как объекты NSColor и NSFont, из системы по умолчанию пользователя . Но если объекты соответствуют протоколу NSCoding , они могут быть заархивированы в объекты NSData, которые являются свойством совместимых с списком объектов. Для получения информации о том, как это сделать, см. "" Сохранение NSColor в настройках пользователя по умолчанию ""; хотя в этой статье основное внимание уделяется объектам NSColor, процедура может быть применена к любому объекту, который может быть архивирован .

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsuserdefaults_Class/Reference/Reference.html

EDIT:

При определении предпочтений своего приложения, то лучше использовать простые значения и типы данных, когда это возможно. Система предпочтений - , построенная вокруг типов данных списка свойств, таких как строки, цифры и цифры . Хотя вы можете использовать объект NSData для хранения произвольных объектов в настройках, делать это не рекомендуется в большинстве случаев.

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

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

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/UserDefaults/AboutPreferenceDomains/AboutPreferenceDomains.html#//apple_ref/doc/uid/10000059i-CH2-SW2

+0

К сожалению, я просто добавил пример! Что я хотел узнать, что лучше. Не так, как это сделать! – Rikh

+0

Я думаю, что 'NSKeyedArchiver' является более подходящим способом хранения пользовательского объекта в' NSUserDefaults'. –

+0

Но почему это? Можете ли вы добавить какой-то пример или какую-то причину того, как он более оптимизирован? – Rikh