如何在ios中正确缓存图像

时间:2016-04-06 08:28:03

标签: ios uitableview caching sdwebimage

我使用SDWebImage来缓存图片。但它不起作用。我在cellForRowAtIndexPath下以这种方式使用它:

[cell.image sd_setImageWithURL:[NSURL URLWithString:[NSMutableString stringWithFormat:@"%@app/media/access/pictures?p=%@",baseurl,data.picPath]]
                 placeholderImage:[UIImage sd_animatedGIFNamed:@"image_loader.gif"] options:SDWebImageRefreshCached];

我想它是异步下载图像的。但我的应用程序在滚动UITableView时会冻结。滚动时也有网络使用,对我而言,当我缓存它时不应该发生。

除了根据UIImageView下的图像大小,我有一些逻辑来调整heightForRowAtIndexPath帧的大小,这可能是什么原因???

if(data.type == 2)
    {
        height = 260.00;
    }
    else if(data.type == 1)
    {
        height = self.view.frame.size.width/2 + 115;
    }
    else
    {
        NSString *filePath = [NSString stringWithFormat:@"%@app/media/access/pictures?p=%@",baseurl,data.picPath];
        self.img = [UIImage imageWithData: [NSData dataWithContentsOfURL:[NSURL URLWithString:filePath]]];


        if (self.img.size.width > CGRectGetWidth(self.view.bounds)) {
            CGFloat ratio = self.img.size.height / self.img.size.width;
            return CGRectGetWidth(self.view.bounds) * ratio+120;
        } else {
            return self.img.size.height+110;
        }




    }

4 个答案:

答案 0 :(得分:3)

这是肯定的:

self.img = [UIImage imageWithData: [NSData dataWithContentsOfURL:[NSURL URLWithString:filePath]]];

为什么要再次下载图片?您应该始终使用SDWebImage

<强>添加 而不是做

NSString *filePath = [NSString stringWithFormat:@"%@app/media/access/pictures?p=%@",baseurl,data.picPath];
self.img = [UIImage imageWithData: [NSData dataWithContentsOfURL:[NSURL URLWithString:filePath]]];

您需要在heightForRow等待异步块之前下载图像。尝试使用SDWebImage sharedDownloader预加载它们。然后他们将在缓存中。

答案 1 :(得分:1)

heightForRowAtIndexPath中的以下代码导致问题:

NSString *filePath = [NSString stringWithFormat:@"%@app/media/access/pictures?p=%@",baseurl,data.picPath];
        self.img = [UIImage imageWithData: [NSData dataWithContentsOfURL:[NSURL URLWithString:filePath]]];

每次滚动tableView时都会执行代码,因为它不是异步调用,所以会导致冻结问题。

<强> 编辑: 为了避免这种情况,你可以这样做:

完成下载后即可使用,

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] 
                 withRowAnimation:UITableViewRowAnimationAutomatic];

这将再次致电

    -(CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath

像,

[cell.image sd_setImageWithURL:[NSURL URLWithString:[NSMutableString stringWithFormat:@"%@app/media/access/pictures?p=%@",baseurl,data.picPath]]

                                     completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {

                                         if (error) {

                                             NSLog(@"error: %@",error.description);


                                         }
                                         else{

                                             //get image height and return this height from HeightForRowAtIndexPath
                                             Height=image.size.height;

                                             //reloading row will call heightForRowAtIndexPath,where now you can return height got above
                                             [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationAutomatic];

                                             NSLog(@"Not an error in image download");
                                         }




                                     }];

<强> EDIT1

要检查已经缓存的图像,可以使用SDWebImage库的下面方法:

- (BOOL)diskImageExistsWithKey:(NSString *)key;

缓存键是要缓存的映像的应用程序唯一标识符。它通常是图像的绝对URL。

现在如果图像存在于缓存中,则使用SDWebImage Library的以下方法获取图像路径:

- (NSString *)defaultCachePathForKey:(NSString *)key;
- (NSString *)cachedFileNameForKey:(NSString *)key;

您可以像这样获取图片的路径:

NSString *ImageKey;//key for the image you want the path for
[[SDImageCache sharedImageCache] defaultCachePathForKey:ImageKey];

如果您不使用默认位置,可以使用:

- (NSString *)cachePathForKey:(NSString *)key inPath:(NSString *)path;

有关详细信息,请点击此处:SDWebImage

答案 2 :(得分:0)

以下是缓存图片的最佳示例

Best way to cache images on ios app?

希望它会帮助你

答案 3 :(得分:0)

https://github.com/rs/SDWebImage

  

你可以看一下这个库