2015-09-12 3 views
0

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

+0

Вы не показываете, как все эти различные методы называются ... – Wain

+0

Являются ли объекты self.array правильными строками массива ??? –

+0

Строка пути к файлу выглядит следующим образом. Не знаю, будет ли это выглядеть так:/var/mobile/Containers/Data/Application/76C19807-8080-4F21-8AD8-3497DCC81600/Documents/DEEB9DAE-8BC5-47AD-B062-E49D438ADE9F – noobsmcgoobs

ответ

0

Я столкнулся с той же проблемой раньше. Вы пишете изображение на путь и сохраняете его в основных данных. Позже прочитайте путь изображения, он точно такой же, но изображение не загружено.

Итак, вы протестировали приложение в симуляторе? Я не знаю, если это предназначено или что-то вроде ошибки, но оно будет работать так, как вы хотели на реальных устройствах.

Так что попробуйте запустить приложение на реальных устройствах и посмотреть, работает ли оно.

+0

Реальное устройство и его не работает. Вот почему я хотел посмотреть, была ли проблема с моим кодом. Вы видели какие-либо проблемы с моим кодом? – noobsmcgoobs

0

Я только что узнал, что в iOS 8 пути файлов сбрасываются после каждого запуска приложения. Приведенный выше код сохранит имя файла в Core Data и заново создаст путь к документам при вызове файла.

Например, ниже будет создано имя файла.

- (NSString *)createPathForDataFile 
{ 

    NSString *stringForSaving = [[NSUUID UUID]UUIDString]; 

    NSLog(@"filePath in CreatePathForDataFile %@", stringForSaving); 

    return stringForSaving; 
} 

Сохранение произойдет путем вызова пути к папке «Документы» и передачи имени файла в качестве параметра filePath.

- (void)saveItemsAtFilePath:(NSString*)filePath andImageToArchive:(ImageForArchiving*)imageRecord { 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

    NSString *documentsPath = [paths objectAtIndex:0]; 

    NSString *finalFilePath = [documentsPath stringByAppendingPathComponent:filePath]; 

    [NSKeyedArchiver archiveRootObject:imageRecord toFile:finalFilePath]; 
} 

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

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