【问题标题】:Storing and retrieving images from documents directory in tableView?从tableView中的文档目录存储和检索图像?
【发布时间】:2016-10-24 12:27:20
【问题描述】:

我正在尝试将来自 web 服务的图像存储在文档目录中。对于存储的图像,我想从表格视图的文档目录中加载它。 图片可从以下网址访问:- http://Address/App/User/Image/Puegeot_E7

从 web 服务获取成功,但是从文档目录中我不断得到空图像。似乎找不到这里有什么问题。

- (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];
   }
}

【问题讨论】:

    标签: ios objective-c uitableview uiimage nsdocumentdirectory


    【解决方案1】:

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

    这么说:

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

    在您的 getImageFromURL 方法中。

    不要只使用图像名称来检索图像。 希望这会有所帮助!

    (抱歉我的文字布局不好,我正在手机上打字)

    【讨论】:

    • 根据建议,我已经更新了代码。但是仍然面临同样的问题。
    【解决方案2】:

    从您在日志中看到的内容来看,问题似乎很明显:

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

    该路径不在文档目录中。

    为了更牢固地控制这一点,让 save 方法返回保存图像的路径:

    - (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);
    

    回到真正的应用程序......在模型中写入图像返回的路径之后:

    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 方法将看到保存的路径,并且我们从测试中知道从该路径创建图像将起作用。

    【讨论】:

      【解决方案3】:

      首先,我建议您使用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]];
      

      【讨论】:

      • 谢谢..它工作得很好。 SDWebImage 看起来不错,我只是想在不使用库的情况下尝试一下。
      • 不用担心。很高兴它有帮助
      猜你喜欢
      • 2023-03-03
      • 2013-07-18
      • 2017-01-14
      • 1970-01-01
      • 2013-12-02
      • 1970-01-01
      • 2014-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多