从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
方法中。
不要只使用图像名称来检索图像。 希望这可以帮助!
(对不起,我的文本布局不好,我正在打电话)