Я обнаружил одну альтернативу, перед сохранением кодирую корневой объект ( NSArray
объект) с помощью NSKeyedArchiver
, который заканчивается на NSData
. Затем используйте UserDefaults сохранить NSData
.
Когда мне нужны данные, я считываю NSData
и использую NSKeyedUnarchiver
для преобразования NSData
обратно в объект.
Это немного громоздко, потому что мне нужно конвертировать в / из NSData
каждый раз, но это просто работает.
Вот один пример для каждого запроса:
Сохранить:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *arr = ... ; // set value
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:arr];
[defaults setObject:data forKey:@"theKey"];
[defaults synchronize];
Загрузить:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults objectForKey:@"theKey"];
NSArray *arr = [NSKeyedUnarchiver unarchiveObjectWithData:data];
Элемент в массиве реализует
@interface CommentItem : NSObject<NSCoding> {
NSString *value;
}
Затем в реализации CommentItem
предусмотрены два метода:
-(void)encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeObject:value forKey:@"Value"];
}
-(id)initWithCoder:(NSCoder *)decoder
{
self.value = [decoder decodeObjectForKey:@"Value"];
return self;
}
У кого-нибудь есть лучшее решение?
Спасибо всем.
Если вы сохраняете объект в пользовательских настройках по умолчанию, все объекты, рекурсивно, до конца, должны быть объектами списка свойств. Соответствие NSCoding ничего не значит здесь
NSUserDefaults
- не будет автоматически их кодироватьNSData
, вы должны сделать это сами. Если ваш «список объектов, который реализуетNSCoding
» означает объекты, которые не являются объектами списка свойств, вам придется что-то с ними сделать, прежде чем сохранять их по умолчанию.FYI классы список недвижимости являются
NSDictionary
,NSArray
,NSString
,NSDate
,NSData
, иNSNumber
. Вы можете записывать изменяемые подклассы (напримерNSMutableDictionary
) в пользовательские настройки, но считанные объекты всегда будут неизменными.источник
Все ваши ключи в словаре
NSString
? Я думаю, что они должны быть для того, чтобы сохранить словарь в список свойств.источник
Самый простой ответ:
NSDictionary
является только объектом plist , если ключи являются NSStrings . Итак, Храните «Ключ» какNSString
сstringWithFormat
.Решение :
Преимущества :
NULL
.источник
Рассматривали ли вы вопрос реализации
NSCoding
Протокола? Это позволит вам кодировать и декодировать на iPhone двумя простыми способами, которые реализованы с помощьюNSCoding
. Сначала вам нужно добавитьNSCoding
свой класс.Вот пример:
Это в .h файле
Тогда вам нужно будет реализовать два метода протокола NSCoding.
Проверьте документацию по NSCoder для получения дополнительной информации. Это очень удобно для моих проектов, где мне нужно сохранить состояние приложения на iPhone, если приложение закрыто, и вернуть его обратно в состояние, когда оно снова включено.
Ключ должен добавить протокол к интерфейсу и затем реализовать два метода, которые являются частью
NSCoding
.Надеюсь, это поможет!
источник
Там нет лучшего решения. Другой вариант - просто сохранить закодированный объект на диск - но это делает то же самое. Они оба заканчивают с NSData, который декодируется, когда вы хотите его вернуть.
источник