Я пытаюсь сохранить данные между закрытием приложения и циклами питания, используя NSKeyedArchiver. Корневой объект, который я пытаюсь сохранить, представляет собой NSMutableArray, но внутри него есть коллекции объектов Foundation и Custom (все они соответствуют NSCoding).
Код сохранения файла выглядит следующим образом
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *fullFileName = [NSString stringWithFormat:@"%@/sessionDataSaveFile",documentsDirectory];
NSMutableData *pData = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initRequiringSecureCoding:NO];
[archiver encodeObject:self.sessionData];
[archiver finishEncoding];
[pData appendData:[archiver encodedData]];
[pData writeToFile:fullFileName atomically:YES];
Файл сохраняется нормально, исключений не возникает. При повторном запуске приложения этот файл восстанавливается с помощью следующего кода.
NSArray *paths = NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *fullFileName = [NSString stringWithFormat:@"%@/sessionDataSaveFile", documentsDirectory];
NSData *pData = [[NSData alloc] initWithContentsOfFile:fullFileName];
NSError *error = nil;
NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData:pData error:&error];
self.sessionData = [unArchiver decodeObject];
[unArchiver finishDecoding];
На данный момент sessionData всегда равен нулю, однако длина pData составляет несколько тысяч байт, поэтому я знаю, что проблема в методе декодирования. Я пробовал [[NSMutableArray alloc] initWithCoder]
и почти все варианты методов NSKeyedUnarchiver, но все равно бесполезно. Где я ошибаюсь?
NSKeyedArchiver
, если у вас уже естьNSData
? - person Larme   schedule 09.04.2021NSKeyedArchiver
иNSKeyedUnarchiver
. Я бы сделал:[self.sessionData writeToFile:fullFileName atomically:YES]
иself.sessionData = [[NSData alloc] initWithContentsOfFile:fullFileName];
. - person Larme   schedule 09.04.2021NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *fullFileName = [NSString stringWithFormat:@"%@/sessionDataSaveFile",documentsDirectory];
Прочитатьself.sessionData = [[NSMutableArray alloc] initWithContentsOfFile:fullFileName]; if(self.sessionData == nil){ self.sessionData = [[NSMutableArray alloc] init]; }
Не повезло! - person DaveMoore   schedule 09.04.2021[NSKeyedarchived archivedDataWithRootObject:self.sessionData requiringSecureCoding:YES error:&error];
тогда? Кроме того, развеerror
параметр не является нулевым после вызовов? - person Larme   schedule 09.04.2021