NSDocumentDirectory我是iOS新手。我试图建立一个简单的应用程序,以更好地掌握核心数据和文件系统。我无法检索我显然存储的数据。
-I检查文件是否存在于路径中,但是当我尝试NSLog数据并返回null时。
非常感谢任何帮助。我的直觉是这是一个范围或内存保留问题,但我无法弄明白。
这是UIImagePicker的保存方法
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
UIImage *imageToAdd = info[UIImagePickerControllerOriginalImage];
NSData *pngsData = UIImagePNGRepresentation(imageToAdd);
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docPath = [paths objectAtIndex:0];
NSString *filePath = [docPath stringByAppendingFormat:@"%@.png",[self getdateAndTime]];
NSError *error;
BOOL succcess = [pngsData writeToFile:filePath options:NSDataWritingAtomic error:&error];
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
NSLog(@"The file exists");
}
if (error !=nil) {
NSLog(@"errorIS %@", error);
}
CoreDataStack *cds = [CoreDataStack defaultStack];
Photo *photo = [NSEntityDescription insertNewObjectForEntityForName:@"Photo" inManagedObjectContext:cds.managedObjectContext];
photo.photoName = filePath;
[cds saveContext];
[self dismissViewControllerAnimated:YES completion:nil];
[self.collectionView reloadData];
}
这是用于检索Collection View
的存储数据的代码- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
PhotoCollectionViewCell *photoCell = (PhotoCollectionViewCell*)[collectionView dequeueReusableCellWithReuseIdentifier:@"photoCell" forIndexPath:indexPath];
Photo *photo = [self.fetchedResultsController objectAtIndexPath:indexPath];
NSLog(@"%@",photo.photoName);
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *imageLocation = [documentsDirectory stringByAppendingString:photo.photoName];
NSData *data = [NSData dataWithContentsOfFile:imageLocation];
UIImage *image = [UIImage imageWithData:self.testImageData];
NSLog(@"%@", data);
photoCell.cellImage.image = image;
photoCell.layer.borderColor = [[UIColor blackColor] CGColor];
photoCell.layer.borderWidth = 2.0;
return photoCell;
}
答案 0 :(得分:3)
您有几个问题:
NSDocumentationDirectory
替换为NSDocumentDirectory
。您正在错误地构建路径。这样:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES);
NSString *docPath = [paths objectAtIndex:0];
NSString *filePath = [docPath stringByAppendingFormat:@"%@.png",[self getdateAndTime]];
应该是:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docPath = [paths objectAtIndex:0];
NSString *filename = [NSString stringWithFormat:@"%.png", [self getdataAndTime]];
NSString *filePath = [docPath stringByAppendingPathComponent:filename];
请注意stringByAppendingPathComponent:
的使用。这个很重要。如果没有它,你最终得到:
... / sandboxpath / Documentsfilename.png
而不是:
... / sandboxpath /文档/ filename.png
在两种方法中进行相同的修复。
您正在保存Photo
对象的完整路径。绝不保存绝对路径。它们随着时间而变化。仅保存相对于Documents
的文件名。所以改变:
photo.photoName = filePath;
为:
photo.photoName = filename;
将来读回值时,请将其附加到文档路径。
您的错误检查应该是:
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
NSLog(@"The file exists");
} else {
NSLog(@"errorIS %@", error);
}
答案 1 :(得分:1)
您的文件可能无法在加载时找到,因为您的存储路径包含可以从构建更改为构建的部分。查看此问题以获得类似的问题/结果。
Can't find saved file (in device) after restarting the app
最佳答案:不要存放可变部分;后备答案:确保用当前值替换可变部分。