`
iaiai
  • 浏览: 2204928 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

iOS 第三方框架SDWebImage的简单使用

 
阅读更多
缓存处理的三种方式,其中最难,最麻烦,最占内存资源的还是图片缓存,最近做的项目有大量的图片处理,还是采用了SDWebImage来处理,但是发现之前封装好的代码报错了。研究发现,是我用了新版的SDWebImage,好多方法都变了。

现在把代码贴出来,供大家参考。尤其是新手,看完这篇博客,图片缓存so easy。最后有demo供大家下载,先学习。

第一步,下载SDWebImage,导入工程。github托管地址https://github.com/rs/SDWebImage

第二步,在需要的地方导入头文件
#import "UIImageView+WebCache.h"


第三步,调用sd_setImageWithURL:方法缓存图片,注意,这就是新版本的新方法,旧方法是setImageWithURL:。下面将几个方法都介绍一下。

1. sd_setImageWithURL:
//图片缓存的基本代码,就是这么简单
[self.image1 sd_setImageWithURL:imagePath1];


2. sd_setImageWithURL:  completed:
//用block 可以在图片加载完成之后做些事情
[self.image2 sd_setImageWithURL:imagePath2 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
NSLog(@"这里可以在图片加载完成之后做些事情");
}];


3. sd_setImageWithURL:  placeholderImage:
//给一张默认图片,先使用默认图片,当图片加载完成后再替换
[self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@"default"]];


4. sd_setImageWithURL:  placeholderImage:  completed:
//使用默认图片,而且用block 在完成后做一些事情
[self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@"default"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
NSLog(@"图片加载完成后做的事情");
}];


5. sd_setImageWithURL:  placeholderImage:  options:
//options 选择方式
[self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@"default"] options:SDWebImageRetryFailed];


其他就不一一介绍了,oc是自文档语言,看方法名就知道干什么的了。除了带options选项的方法,其他的方法都是综合存储,也就是内存缓存和磁盘缓存结合的方式,如果你只需要内存缓存,那么在options这里选择SDWebImageCacheMemoryOnly就可以了。

如果不想深入了解,到这里你已经可以用SDWebimage进行图片缓存了,接下来我要解释options的所有选项,以及SDWebImage内部执行流程。

一、options所有选项:
  //失败后重试
     SDWebImageRetryFailed = 1 << 0,
      
     //UI交互期间开始下载,导致延迟下载比如UIScrollView减速。
     SDWebImageLowPriority = 1 << 1,
      
     //只进行内存缓存
     SDWebImageCacheMemoryOnly = 1 << 2,
      
     //这个标志可以渐进式下载,显示的图像是逐步在下载
     SDWebImageProgressiveDownload = 1 << 3,
      
     //刷新缓存
     SDWebImageRefreshCached = 1 << 4,
      
     //后台下载
     SDWebImageContinueInBackground = 1 << 5,
      
     //NSMutableURLRequest.HTTPShouldHandleCookies = YES;
      
     SDWebImageHandleCookies = 1 << 6,
      
     //允许使用无效的SSL证书
     //SDWebImageAllowInvalidSSLCertificates = 1 << 7,
      
     //优先下载
     SDWebImageHighPriority = 1 << 8,
      
     //延迟占位符
     SDWebImageDelayPlaceholder = 1 << 9,
      
     //改变动画形象
     SDWebImageTransformAnimatedImage = 1 << 10,


二、SDWebImage内部实现过程

  • 入口 setImageWithURL:placeholderImage:options: 会先把 placeholderImage 显示,然后 SDWebImageManager 根据 URL 开始处理图片。
  • 进入 SDWebImageManager-downloadWithURL:delegate:options:userInfo:,交给 SDImageCache 从缓存查找图片是否已经下载 queryDiskCacheForKey:delegate:userInfo:.
  • 先从内存图片缓存查找是否有图片,如果内存中已经有图片缓存,SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo: 到 SDWebImageManager。
  • SDWebImageManagerDelegate 回调 webImageManager:didFinishWithImage: 到 UIImageView+WebCache 等前端展示图片。
  • 如果内存缓存中没有,生成 NSInvocationOperation 添加到队列开始从硬盘查找图片是否已经缓存。
  • 根据 URLKey 在硬盘缓存目录下尝试读取图片文件。这一步是在 NSOperation 进行的操作,所以回主线程进行结果回调 notifyDelegate:。
  • 如果上一操作从硬盘读取到了图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo:。进而回调展示图片。
  • 如果从硬盘缓存目录读取不到图片,说明所有缓存都不存在该图片,需要下载图片,回调 imageCache:didNotFindImageForKey:userInfo:。
  • 共享或重新生成一个下载器 SDWebImageDownloader 开始下载图片。
  • 图片下载由 NSURLConnection 来做,实现相关 delegate 来判断图片下载中、下载完成和下载失败。
  • connection:didReceiveData: 中利用 ImageIO 做了按图片下载进度加载效果。
  • connectionDidFinishLoading: 数据下载完成后交给 SDWebImageDecoder 做图片解码处理。
  • 图片解码处理在一个 NSOperationQueue 完成,不会拖慢主线程 UI。如果有需要对下载的图片进行二次处理,最好也在这里完成,效率会好很多。
  • 在主线程 notifyDelegateOnMainThreadWithInfo: 宣告解码完成,imageDecoder:didFinishDecodingImage:userInfo: 回调给 SDWebImageDownloader。
  • imageDownloader:didFinishWithImage: 回调给 SDWebImageManager 告知图片下载完成。
  • 通知所有的 downloadDelegates 下载完成,回调给需要的地方展示图片。
  • 将图片保存到 SDImageCache 中,内存缓存和硬盘缓存同时保存。写文件到硬盘也在以单独 NSInvocationOperation 完成,避免拖慢主线程。
  • SDImageCache 在初始化的时候会注册一些消息通知,在内存警告或退到后台的时候清理内存图片缓存,应用结束的时候清理过期图片。
  • SDWI 也提供了 UIButton+WebCache 和 MKAnnotationView+WebCache,方便使用。
  • SDWebImagePrefetcher 可以预先下载图片,方便后续使用。

从上面流程可以看出,当你调用setImageWithURL:方法的时候,他会自动去给你干这么多事,当你需要在某一具体时刻做事情的时候,你可以覆盖这些方法。比如在下载某个图片的过程中要响应一个事件,就覆盖这个方法:

    //覆盖方法,指哪打哪,这个方法是下载imagePath2的时候响应
    SDWebImageManager *manager = [SDWebImageManager sharedManager];
     
    [manager downloadImageWithURL:imagePath2 options:SDWebImageRetryFailed progress:^(NSInteger receivedSize, NSInteger expectedSize) {
         
        NSLog(@"显示当前进度");
         
    } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
         
        NSLog(@"下载完成");
    }];


对于初级来说,用sd_setImageWithURL:的若干个方法就可以实现很好的图片缓存。
分享到:
评论

相关推荐

    ios开发 常用第三方框架

    在iOS开发中,引入第三方框架可以极大地提升开发效率和应用质量。本篇文章将重点讨论“ios开发 常用第三方框架”中的一个具体实践:在UITableView中实现数据刷新时的header和footer动画,同时也会涉及与之相关的网络...

    SDWebImage(第三方框架)

    总的来说,SDWebImage是iOS开发中不可或缺的第三方框架之一,它简化了网络图片处理的复杂度,提高了应用性能。无论是对于个人开发者还是团队,都大大提升了开发效率和应用质量。通过熟练掌握SDWebImage的使用,...

    包含ios开发的第三方包

    在iOS开发中,第三方库和框架的使用是十分常见的,它们可以帮助开发者快速、高效地实现各种功能。这个压缩包“包含ios开发的第三方包”显然提供了几个关键的工具,包括JSON对象的转换、百度地图SDK、网络请求类以及...

    07-第三方框架1

    本文将深入探讨如何使用第三方API,以及一些常见的iOS第三方开发库。 首先,我们来理解什么是第三方API。API(Application Programming Interface)是应用程序接口,它允许不同的软件系统之间进行交互。第三方API...

    ios常用三方框架

    下面,我们将深入探讨几个常见的iOS第三方框架,以及它们在实际开发中的应用。 首先,让我们关注JSON(JavaScript Object Notation)处理框架。JSON是一种轻量级的数据交换格式,广泛用于服务器与客户端之间的数据...

    ios-iOS 纯代码基础框架 包括各种分类干货.zip

    - SDWebImage库:学习集成第三方库,实现网络图片的加载和缓存。 10. **权限管理**: - 获取用户权限:如相机、相册、地理位置等,了解如何请求和处理权限。 11. **错误处理**: - NSError:理解错误对象的使用...

    ios-商品详情框架.zip

    1. 商品图片视图:使用UIImageView或第三方库如SDWebImage加载和展示商品大图及缩略图,可能支持手势滑动切换。 2. 商品信息展示:UILabel用于展示商品名称、价格、库存等文本信息,可能通过NSAttributedString实现...

    iOS--AFNetworking第三方

    **iOS--AFNetworking第三方框架详解** AFNetworking是iOS开发中广泛使用的网络请求库,由Alamofire Software Foundation维护。这个第三方框架极大地简化了iOS应用中的网络编程,支持HTTP请求的各种方法,包括GET、...

    iOS开发常用的第三方库

    在iOS应用开发中,使用第三方库能够极大地提升开发效率,减少重复劳动,并提供更丰富的功能。以下是一些iOS开发中常用的第三方库,它们涵盖了界面刷新、网络请求、自动适配等多个方面。 1. **界面刷新**: - **...

    图片解析第三方工具

    现在,我们有了一种更好的解决方案——第三方库SDWebImage。 SDWebImage是一个强大的、开源的iOS图片下载与缓存框架,它简化了图片处理的过程,使得开发者可以更便捷地在应用中实现图片的加载、缓存和显示。这个...

    iOS常用第三方类库 - CocoaChina 苹果开发中文站 - 最热的iPhone开发社区 最热的苹果开发社区 最热的iPa

    以下是一些常用的iOS第三方类库及其应用领域: 1. JSON解析:对于处理JSON格式的数据,`json`库是必不可少的。例如,`Gson`(GTMBase64)可以方便地进行Base64编码和解码,而`TouchXML`则用于XML解析。 2. ...

    SDWebImage

    10. **第三方库集成**:除了基本功能,SDWebImage还可以与其他第三方库结合使用,如Kingfisher、AlamofireImage等,提供更丰富的图片处理和加载选项。 在"SDWebImage-master"文件夹中,你会看到包括源代码、示例...

    千锋ios开发常用第三方库资源例子

    在iOS开发中,引入第三方库可以极大地提升开发效率和应用质量。"千锋ios开发常用第三方库资源例子"是一个集合了各种实用库的示例项目,涵盖了网络、数据库和下拉刷新等多个方面,且带有详细注释,对于初学者和进阶...

    iOS混合轮播Banner,同时支持本地、网络的视频播放和图片展示

    对于图片,可以集成Kingfisher或SDWebImage等第三方库,实现高效的图片加载和缓存管理;而对于视频,可以使用AVFoundation框架,结合FFmpeg库,实现视频的播放和预加载。 对于网络视频的播放,iOS的...

    iOS开发常用第三方库

    在iOS应用开发中,第三方库扮演着至关重要的角色,它们为开发者提供了丰富的功能,提高了开发效率,降低了出错的可能性。以下是一些常见的iOS开发中常用的第三方库及其详细说明: 1. **Alamofire** - Alamofire 是...

    ios-高仿美团框架.zip

    - SDWebImage:第三方库,用于加载和缓存网络图片,防止频繁的网络请求。 5. 用户体验优化(User Experience): - UIRefreshControl:下拉刷新控件,提高用户体验,当用户下拉时自动加载新数据。 - 页面加载...

    IOS应用源码之【类库与框架】FlowCover.rar

    开发者常常会引入第三方类库来扩展iOS原生功能,如AFNetworking(网络请求)、MBProgressHUD(进度提示)、SDWebImage(图片加载)等。"FlowCover"可能就利用了一些第三方库来实现特殊效果或功能。 4. **Swift ...

    SDWebImage的使用

    在这个场景中,`SDWebImage`是一个非常流行的第三方库,它能够高效、智能地处理网络图片的加载。`SDWebImage`结合了`AFNetworking`框架,提供了强大的图片下载、缓存和显示功能。下面将详细介绍这两个框架的使用以及...

Global site tag (gtag.js) - Google Analytics