如何在缓存中存储图像数据

时间:2014-07-07 03:21:03

标签: ios objective-c caching

我有一个来自url的可变数据字典存储图像。所以如何在应用程序缓存中存储图像,我可以在没有互联网连接时查看图像。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
    static NSString * CellIndentifier=@"CustomCell";
    CustomCell *cell = (CustomCell*)[collectionView dequeueReusableCellWithReuseIdentifier:CellIndentifier forIndexPath:indexPath];
    NSDictionary *dictVideo = [self.videoList objectAtIndex:indexPath.row];
    [cell.indicator startAnimating];
    //set title
    NSString *titleVideo = [dictVideo objectForKey:@"Title"];
    [cell.myLabel setText:titleVideo];
    // set image url
    NSString *urlVideo = [dictVideo objectForKey:@"Url"];
    NSURL *url = [NSURL URLWithString:urlVideo];
    cell.imageView.image = nil;
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSData *data = [NSData dataWithContentsOfURL:url];
        UIImage * img = [[UIImage alloc]initWithData:data];
        dispatch_sync(dispatch_get_main_queue(), ^{
            NSLog(@"%ld  %@  %@",(long)indexPath.row,titleVideo,url);
                [cell.imageView setImage: img];
                [cell.indicator stopAnimating];
        });
          });
           return cell;
    }

2 个答案:

答案 0 :(得分:1)

你可以使用SDWebImage库,因为Umar Farooq说,它支持iOS 6和7 然后,您可以在.m文件中使用以下代码

#import "UIImageView+WebCache.h"
 UIImage *Noimg = [UIImage imageNamed:@"noimg.png"];
     [cell.PlaceImg  setImageWithURL:[NSURL URLWithString:strImgname]  placeholderImage:Noimg];

此处Noimg是占位符图片,当图像位置找不到图像时,它会自动按库管理

答案 1 :(得分:0)

NSURLCache已经为您完成此操作。您的应用程序已经有一个隐含的NSURLCache,可能没有磁盘持久性,因此您需要明确设置它:

NSURLCache *cache = [[NSURLCache alloc]initWithMemoryCapacity:(5 * 1024 * 1024) diskCapacity:(10 * 1024 *1024) diskPath:@"NSURLCache.db"];
[NSURLCache setSharedURLCache:cache];

从那时起,URL加载系统将在内存和磁盘上存储数据。这将允许它在没有连接时可用。你继续像往常一样提出请求,当他们从缓存中提供服务时,他们返回的速度要快得多。

如果要修改此行为,则应修改NSURLRequest使用的缓存策略(例如,NSURLRequestReturnCacheDataElseLoad或NSURLRequestReturnCacheDataDontLoad)。不幸的是,您使用的dataWithContentsOfURL:没有提供机会。使用NSURLSessionTask或NSURLConnection将允许您这样做。

请记住,服务器会告诉客户端响应有效的时间长度,默认缓存策略是否遵循该规则。