IOS 图片下载存缓存沙盒

来源:互联网 发布:mac ftp下载工具 编辑:程序博客网 时间:2024/05/23 13:49

  我们请求加载网络图片的时候,避免多次刷新加载,去下载图片。我们会把图片下载下来存了缓存跟沙盒里。来减少下载流量跟用户体验。

首先我们先定义一个类方法去下载图片Helpr。先上代码在来解释 如:

我们定义一个类方法根据图片地址的
+(nullable UIImage *)setimageWithURL:(NSString *)url;
我们创建一个类方法中返回一个字典对象,做缓存。每次下载下来的图片存入这个字典里<span style="color:#ff0000;">+(NSMutableDictionary  *)images; 
</pre><p></p><pre>
+(UIImage *)setimageWithURL:(NSString *)url{</span>
   //我们先去缓存字典里看看有没有图片  有图片就直接返回图片<span style="color:#cc0000;">        NSData *data=[Helpr images][url];        if (data) {            return [UIImage imageWithData:data];        }
//没有图片我们就去沙盒里看看有没有我们保存的图片  有就直接返回图片        NSString *cachesPath=[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];        NSString *filename=[cachesPath stringByAppendingPathComponent:[url lastPathComponent]];        data=[NSData dataWithContentsOfFile:filename ];        if (!data) {
//沙盒里没有图片我们去下载图片 下载下来并保持到沙盒 跟缓存中 最好返回图片            data=[NSData dataWithContentsOfURL:[NSURL URLWithString:url]];            if (data) {
 [data writeToFile:filename atomically:YES];                [Helpr images][url]=data;            }        }        return [UIImage imageWithData:data];}
+(NSMutableDictionary *)images{    static NSMutableDictionary *queue=nil;    if (queue==nil) {        queue=[NSMutableDictionary dictionaryWithCapacity:10];    }    return queue;}
由于我们下载图片是一个耗时的工作 我们要把下载图片放在子线程中运行。我们一般也就ImgaeView跟Button按钮用到设置网络图片我们可以定义两个类方法;
//设置按钮的背景图片 占位图片<span style="color:#cc0000;">+(void)setButtonbgImageWithURL:( NSString *)url zhanweiImage:(nullable UIImage *)image btton:( UIButton *)btn;
+(void)setImageViewBgimageWithURL:( NSString *)url zhanweiImage:(nullable UIImage *)image imageView:(  UIImageView *)imageView;
+(void)setButtonbgImageWithURL:(NSString *)url zhanweiImage:(UIImage *)image btton:(UIButton *)ban{
//首先我们先设置下按钮的背景占位图片
[btn setBackgroundImage:image];
//我们去开启一个线程来获取图片
   dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);    dispatch_async(queue, ^{        UIImage *image=[self setimageWithURL:url];
  //我们在回到主线程去设置UI图片        dispatch_async(dispatch_get_main_queue(), ^{            [btn setBackgroundImage:image forState:0];        });    });}
#pragma mark---设置iamgeView的背景图片 占位图片+(void)setImageViewBgimageWithURL:(NSString *)url zhanweiImage:(UIImage *)image imageView:(UIImageView *)imageView{    [imageView setImage:image];    dispatch_queue_t queue=dispatch_queue_create("downimage", DISPATCH_QUEUE_CONCURRENT);    dispatch_async(queue, ^{        UIImage *image=[self setimageWithURL:url];        dispatch_async(dispatch_get_main_queue(), ^{            imageView.image=image;        });    });}
这样我们就简单的做了一个缓存图片的方法。对于网络请求做缓存 都可以以这个方法去做    

当然我们也提空2个方法去清除沙盒的图片 

<span style="color:#ff0000;">//删除图片+(void)removeimageWithURL:(NSString *)url;//删除所有图片+(void)removeAllimage;</span>
<span style="color:#ff0000;">#pragma mark---删除指定图片+(void)removeimageWithURL:(NSString *)url{    NSString *cachesPath=[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];    NSString *filename=[cachesPath stringByAppendingPathComponent:[url lastPathComponent]];    [[NSFileManager defaultManager]removeItemAtPath:filename error:nil];}#pragma mark----删除所有图片信息+(void)removeAllimage{        NSString *cachesPath=[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];    [[NSFileManager defaultManager]removeItemAtPath:cachesPath error:nil];}</span>

先去看看缓存空间里有没有。没有在去沙盒目录录有没有,也没有就去下载图片,吧下载的图片存入缓存跟沙盒就好.

0 0
原创粉丝点击