EDIT: Проверены и перепроверены пути к файлам, код для архивирования и разборки и нет обнаруженных ошибок. Есть ли проблема с файловой системой приложений между запусками, о которых я не знаю?NSKeyedUnarchiver возвращает нуль после последующего запуска приложения
Я использую NSCoder для хранения изображений в своем приложении. Я создаю уникальный путь к файлу, сохраняю этот путь к Core Data и архивирую изображение, используя тот же путь к файлу в документах.
В первом запуске приложения все работает так, как ожидалось. Пути файлов, сохраненные в Core Data, используются для разблокировки изображений, хранящихся в документах. Однако при последующих запусках unarchiver возвращает nil, и я получаю сбой.
ImageForArchiving.m - объект, который должен быть сохранен с инициализацией и закодировать методы
+ (ImageForArchiving *)createImageWithImage:(NSData*)data andDate:(NSDate*)date {
ImageForArchiving *archiveImage = [[ImageForArchiving alloc] init];
[archiveImage setDate:date];
[archiveImage setImageData:data];
return archiveImage;
}
- (id) initWithCoder: (NSCoder *)coder
{
if (self = [super init])
{
[self setDate: [coder decodeObjectForKey:@"date"]];
[self setImageData: [coder decodeObjectForKey:@"image"]];
}
return self;
}
- (void) encodeWithCoder: (NSCoder *)coder
{
[coder encodeObject:self.date forKey:@"date"];
[coder encodeObject:self.imageData forKey:@"image"];
}
Сохранение в архив, основных данных, создание путь к файлу и разархивированию кода
- (void)saveItemsAtFilePath:(NSString*)filePath andImageToArchive:(ImageForArchiving*)imageRecord {
[NSKeyedArchiver archiveRootObject:imageRecord toFile:filePath];
}
- (void)loadItemsWithFilePath:(NSString*)filePath {
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
ImageForArchiving *image = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"image %@", image.date);
} else {
NSLog(@"nothing saved");
}
}
-(void)saveToCoreDataWithFilePath:(NSString*)filePath{
AppDelegate *delegate = [UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = delegate.managedObjectContext;
NSManagedObject *photoAndDate = [NSEntityDescription insertNewObjectForEntityForName:@"Image" inManagedObjectContext:context];
[photoAndDate setValue:[NSDate date] forKey:@"date"];
[photoAndDate setValue:filePath forKey:@"image"];
NSError *error = nil;
if (![context save:&error]) {
NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
}
}
- (NSString *)createPathForDataFile
{
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:0];
documentsPath = [documentsPath stringByExpandingTildeInPath];
NSError *error = nil;
if ([fileManager fileExistsAtPath: documentsPath] == NO)
{
[fileManager createDirectoryAtPath:documentsPath withIntermediateDirectories:YES attributes:nil error:&error];
}
NSString *stringForSaving = [[NSUUID UUID]UUIDString];
NSString *filePath = [documentsPath stringByAppendingPathComponent:stringForSaving];
return filePath;
}
Цитирование через массив основных данных для загрузки источника данных. Добавление unarchived объекта w
Вы не показываете, как все эти различные методы называются ... – Wain
Являются ли объекты self.array правильными строками массива ??? –
Строка пути к файлу выглядит следующим образом. Не знаю, будет ли это выглядеть так:/var/mobile/Containers/Data/Application/76C19807-8080-4F21-8AD8-3497DCC81600/Documents/DEEB9DAE-8BC5-47AD-B062-E49D438ADE9F – noobsmcgoobs