在 tableView 的文档目录中存储和检索图像?
Storing and retrieving images from documents directory in tableView?
我正在尝试将来自网络服务的图像存储在文档中 directory.For 我想从 table 视图中的文档目录中加载它。
这些图像可以从 url 访问,例如:- http://Address/App/User/Image/Puegeot_E7
从 web 服务中获取是成功的,但是从文档目录中我一直得到 null image.Can似乎没有发现这里有什么问题。
- (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;
}
在table查看这是我尝试从文档目录加载的方式。
- (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];
}
}
您得到 nil
是因为您没有提供检索图像的正确路径。
您只需使用图像的名称,但您应该使用与保存图像相同的路径。
所以放:
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString* path = [documentsDirectory stringByAppendingPathComponent:imageName];
在你的getImageFromURL
方法中。
不要只使用图片名称来检索您的图片。
希望这对您有所帮助!
(抱歉我的文字排版不好,我正在输入 phone)
根据您在日志中看到的内容,问题似乎很明显:
NSLog(@"imgPath : %@",imgPath); // imgPath : Image/Puegeot_E7
该路径不在文档目录中。
要对此进行更严格的控制,请使用保存方法 return 保存图像的路径:
- (NSString *)saveImage:(UIImage*)image withName:(NSString *)imageName{
// op code, then:
return path;
}
测试您是否可以读回图像。 (此代码用于测试,不适用于应用程序)。
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);
回到真正的应用程序...在路径 return 在您的模型中写入图像后:
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
方法将看到保存的路径,并且我们从测试中知道从该路径创建图像将起作用。
首先,我建议您使用 SDWebImage 库 - 一个支持缓存的异步图像下载器。使用很简单:
[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 ...
}];
但是,如果您想按自己的方式进行。您应该更改第 2 行代码:
UIImage *imgFromDisk = [self getImageFromURL:imgPath];
进入这个:
UIImage *imgFromDisk = [self getImageFromURL:[imgPath lastPathComponent]];
和
[self saveImage:img withName:imgPath];
进入这个:
[self saveImage:img withName:[imgPath lastPathComponent]];
我正在尝试将来自网络服务的图像存储在文档中 directory.For 我想从 table 视图中的文档目录中加载它。
这些图像可以从 url 访问,例如:- http://Address/App/User/Image/Puegeot_E7
从 web 服务中获取是成功的,但是从文档目录中我一直得到 null image.Can似乎没有发现这里有什么问题。
- (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;
}
在table查看这是我尝试从文档目录加载的方式。
- (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];
}
}
您得到 nil
是因为您没有提供检索图像的正确路径。
您只需使用图像的名称,但您应该使用与保存图像相同的路径。
所以放:
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString* path = [documentsDirectory stringByAppendingPathComponent:imageName];
在你的getImageFromURL
方法中。
不要只使用图片名称来检索您的图片。 希望这对您有所帮助!
(抱歉我的文字排版不好,我正在输入 phone)
根据您在日志中看到的内容,问题似乎很明显:
NSLog(@"imgPath : %@",imgPath); // imgPath : Image/Puegeot_E7
该路径不在文档目录中。
要对此进行更严格的控制,请使用保存方法 return 保存图像的路径:
- (NSString *)saveImage:(UIImage*)image withName:(NSString *)imageName{
// op code, then:
return path;
}
测试您是否可以读回图像。 (此代码用于测试,不适用于应用程序)。
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);
回到真正的应用程序...在路径 return 在您的模型中写入图像后:
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
方法将看到保存的路径,并且我们从测试中知道从该路径创建图像将起作用。
首先,我建议您使用 SDWebImage 库 - 一个支持缓存的异步图像下载器。使用很简单:
[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 ...
}];
但是,如果您想按自己的方式进行。您应该更改第 2 行代码:
UIImage *imgFromDisk = [self getImageFromURL:imgPath];
进入这个:
UIImage *imgFromDisk = [self getImageFromURL:[imgPath lastPathComponent]];
和
[self saveImage:img withName:imgPath];
进入这个:
[self saveImage:img withName:[imgPath lastPathComponent]];