Хранение пользовательских объектов как NSDictionary vs NSData

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

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

Использование 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 ?

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

Вот мой ответ на другой подобный вопрос.

Вы можете установить объект следующим образом:

 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]; 

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

 - (void)encodeWithCoder:(NSCoder *)encoder { [encoder encodeObject:self.userName==nil?@"":self.userName forKey: @"userName"]; [encoder encodeObject:self.passWord==nil?@"":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; } 

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

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

РЕДАКТИРОВАТЬ:

Класс NSUserDefaults предоставляет удобные методы для доступа к общим типам, таким как float, doubleles, integers, Booleans и 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

РЕДАКТИРОВАТЬ:

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

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

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

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