zoukankan      html  css  js  c++  java
  • SDWebImage 详解

    一、SDWebImage介绍

    1、在项目的开发过程中,我们经常会用到异步加载图片的功能,先从网络上异步下载图片,然后通过UIImageView显示在屏幕上。这是一个经常使用的功能,基本上所有的联网应用程序都要用到的功能,现在GitHub上已经有非常成熟的框架

    1. SDWebImage(提供异步加载图片、缓存管理,下载进度等,功能最齐全)
    2. EGOImageLoading(之前使用的框架,缓存管理不如SDWebImage设计简单)
    3. AFNetworking (只提供异步加载图片功能,无缓存管理)
    这里主要介绍SDWebImage,这个框架用的最多,在GitHub上已经给出框架的一些使用方法(详情https://github.com/rs/SDWebImage),我们直接下载这个框架,运行里面的Demo发现Xcode会报编译错误,这是因为SDWebImage在项目中引用了GitHub的另外一个项目libwebp的项目,如果要运行Demo网上已经给出了解决办法。
     
    2、我们只是使用异步加载图片及缓存管理的相关功能,不需要libwebp项目,新建项目,将SDWebImage目录下的源代码直接加到项目中
     


    二、使用SDWebImage提供的类扩展实现异步加载图片

    1、SDWebImage提供了UIImageView的扩展类,只需要在头文件中加入文件引用

    1. #import "UIImageView+WebCache.h"  

    异步加载图片方法:

    1. - (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder;  
    • url 图片的地址
    • placeholder   网络图片在尚未加载成功时显示的图像

    默认情况下,SDWebImage会忽略Header中的缓存设置,将图片以url为key进行保存,url与图片是一一对应关系。所以请求同一个url时,SDWebImage会从缓存中取得图片。一般的情况下用此方法可以满足我们的应用要求,但是如果你请求同一个url,而这张图片在服务器端更新了,本地客户端再次请求时还是会返回缓存中的旧图片,例如加载头像类经常更新的图片时,就会出现头像不能更新的问题,由于url与图片一一对应,一种解决的办法是改变部分url地址方式实现更新,不过这种方法操作起来很复杂,下面介绍一个更方便的办法

    1. - (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options;  


    我们将第三个参数设置为SDWebImageRefreshCached就可以实现图片更新操作了,使用方法很简单,如下:

    1. NSURL *url = [NSURL URLWithString:@"http://www.example.com/image.png"];  
    2.    UIImage *defaultImage = [UIImage imageNamed:@"default.png"];  
    3.    [self.imageView setImageWithURL:url placeholderImage:defaultImage options:SDWebImageRefreshCached];  

    三、缓存的计算及清理

    1、缓存计算,这里的缓存计算,只计算SDWebImage的缓存,沙盒文件夹中的其它文件并不包括在内:

    1. [SDWebImageManager.sharedManager.imageCache   
    2. culateSizeWithCompletionBlock:^(NSUInteger fileCount, NSUInteger totalSize) {  
    3.        
    4.  }];  



    2、缓存清理

    在SDWebImage中有两种缓存,一种是磁盘缓存,一种为内存缓存,框架都提供了相应的方法:

    1. [[[SDWebImageManager sharedManager] imageCache] clearDisk];  
    2. [[[SDWebImageManager sharedManager] imageCache] clearMemory];  

    不过这里要特别注意一下,在IOS7中你会发现使用这两个方法缓存总清除不干净,即使断网下还是会有数据。这是因为在IOS7中,缓存机制做了修改,使用上述两个方法只清除了SDWebImage的缓存,没有清除系统的缓存,所以我们可以在清除缓存的代理中额外添加以下:

      1. [[NSURLCache sharedURLCache] removeAllCachedResponses];  
  • 相关阅读:
    python 对xls写入信息
    Python 字符串前面加u,r,b,f的含义
    inner join 与 left join 之间的区别
    时间戳转换成日期展示的方法 且 搜索范围
    Python与C/C++相互调用(python2 调c++那个试了ok)
    爆库记录(X-Forwarded-For注入漏洞实战 记录)
    笔记
    墨者学习安全测试的网站(看起来很不错的样子 有空看看)
    sqlmap开源 测试sql注入的工具 各种参考链接
    菜鸟浅谈——web安全测试(这篇不错有空看看)
  • 原文地址:https://www.cnblogs.com/guangleijia/p/4969131.html
Copyright © 2011-2022 走看看