编辑:已检查并重新检查文件路径,存档和取消存档的代码,未找到错误。在我不知道的启动之间是否存在App File System的问题?
我正在使用NSCoder在我的应用中存储图像。我创建了一个唯一的文件路径,将该文件路径存储到Core Data,并使用文档中的相同文件路径存档图像。
在应用程序首次启动时,一切都按预期工作 - Core Data中保存的文件路径用于取消归档存储在Documents中的图像。然而,在随后的发布中,unarchiver返回nil,然后我崩溃了。
ImageForArchiving.m - 使用init和编码方法保存的对象
+ (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;
}
循环通过Core Data数组加载数据源。添加未归档的对象是
答案 0 :(得分:0)
之前我遇到过同样的问题。您将图像写入路径并将其保存到核心数据。稍后读取图像路径,它完全相同但没有加载图像。
那么,您是否在模拟器中测试了应用程序?我不知道它是故意还是某种bug,但它可以在真实设备上正常工作。
因此,请尝试在真实设备中运行您的应用,看看它是否有效。
答案 1 :(得分:0)
我刚刚发现,在iOS 8中,每次启动应用程序后都会重置文件路径。上面的代码将文件名保存到Core Data,并在调用文件时重新创建Documents的文件路径。
例如,下面将创建文件名。
- (NSString *)createPathForDataFile
{
NSString *stringForSaving = [[NSUUID UUID]UUIDString];
NSLog(@"filePath in CreatePathForDataFile %@", stringForSaving);
return stringForSaving;
}
通过调用Documents文件夹的路径并将文件名作为参数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];
}