NSKeyedUnarchiver всегда возвращает ноль

Я пытаюсь сохранить данные между закрытием приложения и циклами питания, используя 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, но все равно бесполезно. Где я ошибаюсь?


person DaveMoore    schedule 09.04.2021    source источник
comment
Почему вы используете NSKeyedArchiver, если у вас уже есть NSData?   -  person Larme    schedule 09.04.2021
comment
Что ты имеешь в виду? Могу ли я записать NSData непосредственно в файл без использования NSKeyedArchiver для преобразования из NSMutableArray?   -  person DaveMoore    schedule 09.04.2021
comment
Я не понимаю, почему вы используете NSKeyedArchiver и NSKeyedUnarchiver. Я бы сделал: [self.sessionData writeToFile:fullFileName atomically:YES] и self.sessionData = [[NSData alloc] initWithContentsOfFile:fullFileName];.   -  person Larme    schedule 09.04.2021
comment
Извините, нужно было уточнить - self.sessionData - это NSMutableArray. Я только что попробовал следующее. Написать: NSArray *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
comment
[NSKeyedarchived archivedDataWithRootObject:self.sessionData requiringSecureCoding:YES error:&error]; тогда? Кроме того, разве error параметр не является нулевым после вызовов?   -  person Larme    schedule 09.04.2021


Ответы (1)


Решено!

Переключился на использование NSFileManager и сделал простой обмен между массивом и данными для хранения по определенному пути.

person DaveMoore    schedule 09.04.2021