Почему производительность NSKeyedArchiver настолько бедна? Размер удваивается против NSArchiver.NSArchiver vs NSKeyedArchiver performance
Я кодирующая NSMutableArray объектов с помощью следующей строки
BOOL result = [NSArchiver archiveRootObject:self.appDataObject.materias toFile:archivePath];
NSMutableArray содержат пользовательские объекты, которые имеют соответствующие им encodeWithCoder и initWithCoder
-(void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject: _fileName];
[aCoder encodeObject: _categoria];
[aCoder encodeObject: _materia];
[aCoder encodeObject: _nombre];
[aCoder encodeObject: _position];
[aCoder encodeValueOfObjCType:@encode(BOOL) at:&_favorite];
}
-(id)initWithCoder:(NSCoder *)aDecoder
{
if (self=[super init]) {
[self setFileName:[aDecoder decodeObject]];
[self setCategoria:[aDecoder decodeObject]];
[self setMateria:[aDecoder decodeObject]];
[self setNombre:[aDecoder decodeObject]];
[self setPosition:[aDecoder decodeObject]];
[aDecoder decodeValueOfObjCType:@encode(BOOL) at:&_favorite];
}
return self;
}
он работает отлично, как он сохраняет файл правильно и тогда я могу его разблокировать. Они около 3000 объектов, а выходной файл о 900Kb
Проблема возникает, когда я изменить архивирования строку:
BOOL result = [NSKeyedArchiver archiveRootObject:self.appDataObject.materias toFile:archivePath];
Все волшебно работает НО размер файла более чем в два раза до 2MB!
Почему я спрашиваю об этом? потому что я разрабатываю приложение iOS и, следовательно, теряю поддержку NSArchiver.
Да, я понимаю преимущества NSKeyedArchiver, но что, если мне не нужна обратная совместимость? нужна только производительность? В этом примере я даже не использую ключи, объекты все еще сохраняются последовательно, используя одни и те же кодеры, я использую только команду «Keyed», но сохраняю старый способ. Файл занимает более 15 секунд для загрузки в Iphone, что для пользователей очень много. –
Рассматривали ли вы альтернативные методы хранения, такие как данные кода? Вам нужны все 3000 объектов, доступных сразу, или вы можете получить к ним доступ на страницах или кусках? – Rayfleck
Я пошел с NSArchiver за его простоту. NSPropertyListSerialization не позволяет создавать пользовательские объекты. И я постоянно спрашиваю о 3000 предметах, поэтому они должны быть в памяти.Не помню, почему я прекратил использовать Core Data, обычно ли он эффективнее Archiver? –