2013-06-26 2 views
0

У меня есть объект NSDateИспользование NSKeyedArchiver для сохранения объекта NSDate

NSDate* time = [NSDate date]; 

Я пытаюсь сохранить его с помощью NSKeyedArchiver, используя следующие

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *saveFile = [[paths objectAtIndex:0] stringByAppendingPathComponent: @"GameData.dat"]; 

NSMutableData *gameData = [NSMutableData data]; 
NSKeyedArchiver *encoder = [[NSKeyedArchiver alloc] initForWritingWithMutableData: gameData]; 

[encoder encodeObject: time forKey: @"time"]; 

[encoder finishEncoding]; 

[gameData writeToFile:saveFile atomically:YES]; 

И я загрузить его, используя следующие

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *file = [[paths objectAtIndex:0] stringByAppendingPathComponent: @"GameData.dat"]; 
Boolean saveFileExists = [[NSFileManager defaultManager] fileExistsAtPath:file]; 

NSMutableData *gameData = [NSData dataWithContentsOfFile:file]; 
NSKeyedUnarchiver *decoder [[NSKeyedUnarchiver alloc] initForReadingWithData:gameData]; 

time = [decoder decodeObjectForKey: @"time"]; 

Этот метод отлично работает для всех типов данных не объектов, но он всегда возвращает ноль для объектов. Я прочитал документацию Apple для NSKeyedArchiver, и похоже, что я должен делать все правильно, но, как всегда, я, вероятно, не вижу ничего очевидного. Любая помощь будет оценена по достоинству.

+1

перед написанием do 'assert (gameData.length)' и после прочтения данных тоже - посмотрите, есть ли данные в порядке –

+0

Side Note - метод 'fileExistsAtPath:' имеет тип возврата 'BOOL', а не' Boolean'. – rmaddy

+0

Не забудьте вызвать 'finishDecoding', когда закончите декодирование. – rmaddy

ответ

0

После отправки всех ваших объектов архиватору необходимо отправить сообщение finishEncoding, чтобы он мог завершить поток данных.

Вы также можете проверить способ оплаты +archivedDataWithRootObject: или +archiveRootObject:toFile: на NSKeyedArchiver. При этом вы можете заменить большую часть своего кода на одну строку. Для NSKeyedUnarchiver доступны аналоговые методы.

+0

Извините, я забыл добавить бит после кодирования данных в фрагмент кода. Я вызываю finishEncoding и любые объекты, которые я кодирую, все еще возвращают nil, когда я их декодирую. Я обновил фрагмент кода, чтобы включить оставшиеся биты. – Tiddly

+0

Также приветствует советы по методам удобства, я изучу их реализацию. Я не думаю, что переход на это исправит мою проблему на данный момент. – Tiddly

 Смежные вопросы

  • Нет связанных вопросов^_^