从tableView中的文件目录存储和检索图像?

我正试图从webservice存储在文件目录中的图像。对于存储的图像,我想从文档目录中加载它在表视图。 这些图像可以从一个URL访问,例如: http://Address/App/User/Image/Puegeot_E7

从webservice获取成功,但从文档目录我不断收到null image.Can似乎没有find这里有什么问题。

 - (void)saveImage:(UIImage*)image withName:(NSString *)imageName { if (image != nil) { NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString* path = [documentsDirectory stringByAppendingPathComponent:imageName]; NSLog(@"Saving path %@",path); // Saving path /Users/computername/Library/Developer/CoreSimulator/Devices/7277F3D3-298C-451A-8607-8070A08650C7/data/Containers/Data/Application/D3AF4DD9-A4CD-42C8-A8EB-0F15C271EE61/Documents/CabImage/Puegeot_E7 NSData* data = UIImagePNGRepresentation(image); [data writeToFile:path atomically:YES]; } } - (UIImage *)getImageFromURL:(NSString *)fileURL { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *path = [documentsDirectory stringByAppendingPathComponent:fileURL]; NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:path]]; NSLog(@"data %@",data); //This returns (null) UIImage *result = [UIImage imageWithData:data]; return result; } 

在tableView中,这是我正在试图从文档目录加载。

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { //default initialisation stuff NSDictionary *obj = [responseArray objectAtIndex:indexPath.row]; cell.imgVW.image = [UIImage imageNamed:@"default-car.png"]; NSString *imgPath = obj[@"cabimage"]; NSLog(@"imgPath : %@",imgPath); // imgPath : Image/Puegeot_E7 UIImage *imgFromDisk = [self getImageFromURL:imgPath]; NSLog(@"imgFromDisk - %@",imgFromDisk); -> (null) if (imgFromDisk) { cell.imgVW.image = imgFromDisk; } else { //download NSURL *imageURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@User/%@",BASE_URL,imgPath]]; self.task = [self.session downloadTaskWithURL:imageURL completionHandler:^(NSURL *location,NSURLResponse *response,NSError *error) { NSData *img_data = [NSData dataWithContentsOfURL:imageURL]; if (img_data) { UIImage *img = [UIImage imageWithData:img_data]; dispatch_async(dispatch_get_main_queue(), ^{ ListCell *cell = (id)[tableView cellForRowAtIndexPath:indexPath]; cell.imgVW.image = img; [self saveImage:img withName:imgPath]; }); } }]; [self.task resume]; } } 

首先,我build议您使用SDWebImage库 – 一个支持caching的asynchronous图像下载程序。 用法很简单:

 [cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { ... completion code here ... }]; 

但是,如果你想以自己的方式做到这一点。 你应该改变这两行代码:

 UIImage *imgFromDisk = [self getImageFromURL:imgPath]; 

进入这个:

 UIImage *imgFromDisk = [self getImageFromURL:[imgPath lastPathComponent]]; 

 [self saveImage:img withName:imgPath]; 

进入这个:

 [self saveImage:img withName:[imgPath lastPathComponent]]; 

从日志中看到的问题看起来很明显:

 NSLog(@"imgPath : %@",imgPath); // imgPath : Image/Puegeot_E7 

该path不在文档目录中。

为了更好地控制这个,使用save方法返回保存图像的path:

 - (NSString *)saveImage:(UIImage*)image withName:(NSString *)imageName{ // op code, then: return path; } 

testing你可以读回图像。 (这个代码是testing,而不是应用程序)。

 UIImage *testImage = [UIImage imageNamed:@"some_test_image"]; NSString *path = [self saveImage:testImage withName:@"test_name"]; UIImage *didItWork = [self getImageFromURL:path]; NSLog(@"did it work? %@", didItWork); 

回到真实的应用程序…在模型中写入图像后返回的path:

 UIImage *downloadedImage = // however you get this NSString * downloadedImageName = // however you get this NSDictionary *obj = [responseArray objectAtIndex:indexPath.row]; obj[@"cabbage"] = [self saveImage: downloadedImage withName:downloadedImageName]; 

现在我们知道你的cellForRowAtIndexPath方法将会看到保存的path,我们从testing中知道从那个path创build图像是可行的。

你得到nil因为你没有提供正确的path检索图像。 您只需使用图像的名称,但是您应该使用与您保存的位置相同的path。

所以说:

 NSString *documentsDirectory = [paths objectAtIndex:0]; NSString* path = [documentsDirectory stringByAppendingPathComponent:imageName]; 

在你的getImageFromURL方法中。

不要只使用图像名称来检索图像。 希望这可以帮助!

(对不起,我的文本布局不好,我正在打电话)