iOS网络编程(三) 异步加载及缓存图片---->SDWebImage

SDWebImage异步加载图片及缓存的管理与清理 1、在项目的开发过程中,我们经常会用到异步加载图片的功能,先从网络上异步下载图片,然后通过UIImageView显示在屏幕上。这是一个经常使用的功能,基本上所有的联网应用程序都要用到的功能,现在GitHub上已经有非常成熟的框架 SDWebImage(提供异步加载图片、缓存管理,下载进度等,功能最齐全) EGOImageLoading(之前使用的框架,缓存管理不如SDWebImage设计简单) AFNetworking (只提供异步加载图片功能,无缓存管理) 阅读详情

@SDWebImage提供一个UIImageView的类别以支持加载来自网络的远程图片。具有缓存管理、异步下载、同一个URL下载次数控制和优化等特征.


@SDWebImage的导入
1.https://github.com/rs/SDWebImage 下载SDWebImage开源包
2.将类包拖入工程,再导入MapKit.framework、ImageIO.framework两个框架
3.SDWebImage是支持ARC的,在MRC的工程中要注意,可参考MRC工程配置ARC
4.注意:SDWebImage 3.0不向后兼容2.0并且最低需要iOS 5.0 的版本,而且提供的方法多数是Blcok形式



@目前来说,主要用到了"UIImageView+WebCache.h",给出一个代码示例:

        它是UIImageView的一个类目,在要使用它的类中加入#import "UIImageView+WebCache.h",调用                setImageWithURL:placeholderImage:方法。从异步下载到缓存管理,一切都会为你处理。

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. - (void)createImageView{  
  2.       
  3.     self.imageArray = [NSMutableArray array];  
  4.     self.urlArray = @[@"http://c.hiphotos.baidu.com/image/w%3D2048/sign=396e9d640b23dd542173a068e531b2de/cc11728b4710b9123a8117fec1fdfc039245226a.jpg",  
  5.                              @"http://e.hiphotos.baidu.com/image/w%3D2048/sign=c9c32d60f1deb48ffb69a6dec4273b29/960a304e251f95cae5f125b7cb177f3e670952ae.jpg",  
  6.                              @"http://f.hiphotos.baidu.com/image/w%3D2048/sign=0e0fe1d417ce36d3a20484300ecb3b87/3801213fb80e7bec015d1eef2d2eb9389b506b3c.jpg",  
  7.                              @"http://a.hiphotos.baidu.com/image/w%3D2048/sign=6e8e7ce5b11c8701d6b6b5e613479f2f/b3fb43166d224f4a6059b1120bf790529922d1eb.jpg",  
  8.                              @"http://f.hiphotos.baidu.com/image/w%3D2048/sign=e0608e290cf41bd5da53eff465e280cb/aec379310a55b31976baeb7741a98226cffc1774.jpg",  
  9.                              @"http://g.hiphotos.baidu.com/image/w%3D2048/sign=4b5f112a0cf41bd5da53eff465e280cb/aec379310a55b319dd85747441a98226cffc17b6.jpg",  
  10.                              @"http://h.hiphotos.baidu.com/image/w%3D2048/sign=35229123708b4710ce2ffaccf7f6c2fd/c995d143ad4bd113fc73de3058afa40f4bfb0571.jpg",  
  11.                              @"http://b.hiphotos.baidu.com/image/w%3D2048/sign=ad8b74e88fb1cb133e693b13e96c574e/f9dcd100baa1cd11eba86d27bb12c8fcc3ce2d9e.jpg",  
  12.                              @"http://e.hiphotos.baidu.com/image/w%3D2048/sign=ac1303f0a5efce1bea2bcfca9b69f2de/838ba61ea8d3fd1f7dc8e23c324e251f94ca5ff6.jpg",  
  13.                              ];  
  14.   
  15.       
  16.     for (int i = 0; i < 3; i ++) {  
  17.         for (int j = 0; j < 3; j++) {  
  18.               
  19.             UIImageView * imageView = [[UIImageView alloc]init];  
  20.             // 15 10 10 15  
  21.             imageView.frame = CGRectMake(15+100*j, 80+140*i, 90, 120);  
  22.             imageView.backgroundColor = [UIColor redColor];  
  23.             [self.view addSubview:imageView];  
  24.               
  25.             [self.imageArray addObject:imageView];  
  26.               
  27.             [imageView release];  
  28.         }  
  29.     }  
  30.       
  31.     UIButton * button = [UIButton buttonWithType:UIButtonTypeSystem];  
  32.     button.frame = CGRectMake(100, 510, 80, 40);  
  33.     [button setTitle:@"下载" forState:UIControlStateNormal];  
  34.     [button addTarget:self action:@selector(onClickLoadButton) forControlEvents:UIControlEventTouchUpInside];  
  35.     [self.view addSubview:button];  
  36.       
  37. }  
  38.   
  39. - (void)onClickLoadButton{  
  40.   
  41.     //SDWebImageManager * manager = [SDWebImageManager sharedManager];  
  42.       
  43.     for (int i = 0; i < [_imageArray count]; i++) {  
  44.           
  45.         UIImageView * image = [_imageArray objectAtIndex:i];  
  46.         // 异步加载及缓存图片一步到位  
  47.         [image setImageWithURL:[NSURL URLWithString:[_urlArray objectAtIndex:i]] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];  
  48.     }  
  49.   
  50. }  
  51.    查看图片是否进了缓存:



    @独立的异步图像缓存
    SDImageCache类提供一个创建空缓存的实例,并用方法imageForKey:来寻找当前缓存。
    UIImage *myCachedImage = [[SDImageCache sharedImageCache] imageFromKey:myCacheKey];


  52. @其他

          SDWebImage是个比较大的类库,还有其他一些类的用法,自己不太了解,欢迎大家留言给出意见,一起学习,下面给出一些比较好的博客文章(转的)

          http://blog.youkuaiyun.com/shenjx1225/article/details/10444449

    Using blocks

           使用blocks,你将被告知下载进度,完成时是成功还是失败:
    // Here we use the new provided setImageWithURL: method to load the web image
    [cell.imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
                   placeholderImage:[UIImage imageNamed:@"placeholder.png"]
                          completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {... completion code here ...}];

           注意:如果请求被取消,那么block不会被调用(无论成功还是失败)。
  53. Using SDWebImageManager

          The SDWebImageManager is the class behind the UIImageView+WebCache category. It ties the asynchronous downloader with the image cache store. You can use this class directly to benefit from web image downloading with caching in another context than a UIView (ie: with Cocoa)
          下面是如何使用SDWebImageManager的代码:
    SDWebImageManager *manager = [SDWebImageManager sharedManager];
    [manager downloadWithURL:imageURL
                     options:0
                     progress:^(NSUInteger receivedSize, long long expectedSize)
                     {
                         // progression tracking code
                     }
                     completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType)
                     {
                         if (image)
                         {
                             // do something with image
                         }
                     }];

    Using Asynchronous Image Downloader Independently
          也能够独立地使用异步图像下载:
    [SDWebImageDownloader.sharedDownloader downloadImageWithURL:imageURL
                                                        options:0
                                                       progress:^(NSUInteger receivedSize, long long expectedSize)
                                                       {
                                                           // progression tracking code
                                                       }
                                                       completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished)
                                                       {
                                                           if (image && finished)
                                                           {
                                                               // do something with image
                                                           }
                                                       }];

    Using Asynchronous Image Caching Independently
            也可以独立地使用基于异步的图像缓存存储。SDImageCache维护一个内存缓存和一个可选的磁盘缓存。磁盘高

    速缓存的写操作是 异步 进行的,所以它不会给 UI 增加不必要的延迟 。
            
            为了方便,SDImageCache类提供了一个单例,但是如果你想创建单独的缓存命名空间你也可以创建新的实例。
            你可以使用imageForKey:方法来查找缓存,如果返回为nil,说明当前图像不拥有缓存。因此你负责生成并缓存它。缓存键(cache key)是一个程序中图像缓存的唯一标识符,他通常是图像的url。
    SDImageCache *imageCache = [SDImageCache.alloc initWithNamespace:@"myNamespace"];
    [imageCache queryDiskCacheForKey:myCacheKey done:^(UIImage *image)
    {
        // image is not nil if image was found
    }];

            默认情况下,如果一个图像不能在内存缓存中找到,SDImageCache将会查找高速缓存。你可以调用替代的方法imageFromMemoryCacheForKey:来预防这种情况的发生。
            存储一个图像到缓存,你可以使用storeImage:forKey: 方法:
    [[SDImageCache sharedImageCache] storeImage:myImage forKey:myCacheKey];

            默认情况下,图像将被存储在内存上的缓存以及磁盘上的缓存(异步)。
    如果你想只在内存中缓存,使用替代方法storeImage:forKey:toDisk:,第三个参数为负数。

    Using cache key filter

            有时你也许不想使用图像URL作为缓存键,因为URL可能是动态的(i.e.: for access control purpose)。SDWebImageManager provides a way to set a cache key filter that takes the NSURL as input, and output a cache key NSString(这句不大理解)。


            下面的示例在应用程序的委托中设置一个过滤器,在使用它的缓存键之前将从URL中删除任何查询字符串(The following example sets a filter in the application delegate that will remove any query-string from the URL before to use it as a cache key):

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        SDWebImageManager.sharedManager.cacheKeyFilter:^(NSURL *url)
        {
            url = [[[NSURL alloc] initWithScheme:url.scheme host:url.host path:url.path] autorelease];
            return [url absoluteString];
        };
    
        // Your app init code...
        return YES;
    }

    Using dynamic image size with UITableViewCell

          UITableView通过第一个单元格设置的图像决定图像的尺寸。如果您的远程图像没有图像占位符的大小相同,您可能会遇到奇怪的变形缩放问题。下面的文章给出了一个方法来解决这个问题:

    http://www.wrichards.com/blog/2011/11/sdwebimage-fixed-width-cell-images/

    Handle image refresh(控制图像刷新)

            默认情况下,SDWebImage确实非常积极的缓存。它忽略了所有类型的通过HTTP服务器返回的缓存控制头,并

    且没有时间限制地缓存返回的图像。这意味着你的图像url是永远不会改变的、指向图像的静态url。如果指向的图片

    发生了变化,那么url也会相应的跟着变化。

            如果你不控制你的图像服务器,当它的内容更新时你不能改变它的url。Facebook头像就是这种情况的例子。在这种情况下,你可以使用SDWebImageRefreshCached的标志。这将稍微降低性能,但将会考虑到HTTP缓存控制头:

    [imageView setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/olivier.poitrey/picture"]
              placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"]
                       options:SDWebImageRefreshCached];

    Add a progress indicator(添加进度指示)

    查看这个类别: https://github.com/JJSaccolo/UIActivityIndicator-for-SDWebImage

          @好像是SDWebImage2.0的流程介绍 http://blog.youkuaiyun.com/uxyheaven/article/details/7909373




Arduino事件驱动编程:从轮询到ArduProf框架的嵌入式开发新范式 在嵌入式系统开发中,轮询(Polling)是一种基础的控制流程方式,程序通过循环主动检查设备状态。其原理简单直接,但随着系统复杂度增加,会导致响应延迟不可预测、CPU资源浪费和代码结构恶化等问题。事件驱动编程(Event-Driven Programming)通过“事件-响应”机制解决了这些痛点,其技术价值在于实现高效的非阻塞处理、降低功耗并提升代码模块化。在物联网传感器节点、实时交互设备等应用场景中,事件驱动架构能显著改善多任务协调与资源管理。本文以ArduProf Framework为例,探讨如何在资源 阅读详情

相关推荐

JBoltAI框架:Java生态中的AI开发加速器

AI开发框架是现代企业级应用中的关键技术组件,它通过封装底层复杂逻辑,显著提升开发效率。JBoltAI作为Java生态中的全栈式AI开发框架,采用模块化设计将AI能力无缝集成到Spring Boot体系,支持RESTful、gRPC等多种协议。其核心价值在于简化AI模型与企业系统的整合,提供动态模型加载、多租户隔离等企业级特性。在金融风控、智能文档处理等场景中,开发者通过声明式编程即可实现复杂AI功能,开发效率提升60%以上。框架还内置内存管理、并发优化等性能调优手段,并符合GDPR、HIPAA等合规要求,

a1311010193的博客 430

SDWebImage源码解读(四)UIImageView+WebCache

前言 这三个分类比较简单,就放在一起解读了。 正文 UIImageView+WebCache 这是UIImageView的分类,旨在使用UIImageView加载图片。 我们看具体代码 1 - (void)sd_setImageWithURL:(nullable NSURL *)url; 2 3 - (void)sd_setImageWithURL:(null...

weixin_30755393的博客 165

SDWebImage远程图片异步加载

SDWebImage远程图片异步加载, 使用说明:http://www.cnblogs.com/MartinLi841538513/articles/3553059.html

SDWebImage 使用指南:高效加载网络图片的完整方案

SDWebImage 使用指南:高效加载网络图片的完整方案 【免费下载链接】SDWebImage 项目地址: https://gitcode.com/gh_mirrors/sdw/SDWebImage ...

gitblog_01104的博客 676

UIImageView+WebCache

可以轻松的处理网络图片加载的问题,进行异步的加载。

图片异步加载库SDWebImage

在开发中经常会遇到列表加载的功能,其中大部分都包括图片列表加载,但移动设备本身内存有限,而大量图片加载又很耗内存。这是一个第三方图片异步加载库SDWebImage,Github地址为:https://github.com/rs/SDWebImage,这个库主要实现了为UIImageView添加一个类别方法,让使用者使用图片异步加载就好像直接为UIImageView设置image一样,使用非常方便。

SDWebImage实现原理--两张图带你看懂

SDWebImage底层实现有沙盒缓存机制,主要由三块组成:1、内存图片缓存,2、内存操作缓存,3、磁盘沙盒缓存 SDWebImage GitHub地址 版本4.0.0   一、SDWebImage时序图 二、SDWebImage类图 三、SDWebImage原理 1.UIImageView+WebCache: setImageWithURL:placeholderIma

mark_stray 1189

一行代码实现UIImageView的异步加载、缓存图片。(iOS源码)

来源: github/WKWebImage Licence: MIT 作者: Welkin_Xie 一行代码实现UIImageView的异步加载、缓存图片。 安装: pod 'WKWebImage' 并 #import "WKWebImage.h" 异步加载图片 包含以下四种设置方法: // 异步加载图片 - (void)wk_setImageWithURL:(NSURL *)url; // 加载 + 设置placeholder -

SDWebImage动画图像处理:GIF与动态图像支持

SDWebImage动画图像处理:GIF与动态图像支持 【免费下载链接】SDWebImage SDWebImage/SDWebImage: 是一个基于 iOS 的图像缓存和加载库,提供了丰富的图片处理、缓存和异步加载等功能,旨在提高 iOS 应用中的图片加载性能和用户体验。该库简单易用,支持多种图片格式和缓存策略,被广大...

gitblog_00423的博客 1095

手把手教你调试eDP接口:Main Link信号异常、AUXCH通信失败怎么办?

本文提供了一份详尽的eDP接口调试实战指南,重点解决Main Link信号异常与AUXCH通信失败两大核心难题。文章系统介绍了从工具准备、信号完整性分析(眼图、抖动测量)到AUXCH协议解码、HPD信号检查的完整排查流程,并分享了链路训练诊断与常见避坑技巧,帮助硬件工程师高效定位并解决显示问题。

Jerry的专栏 828

Arduino程序设计(十)8×8 共阴极LED点阵显示(MAX7219)

本文主要介绍8×8 LED点阵显示实验,分别是:1、介绍MAX7219点阵模块;2、点阵显示部分图形;3、点阵显示数字 0~9 及 26 个英文字母。1、通过上述两个点阵实验,了解了8*8点阵显示的基本原理;2、通过SPI通信控制点阵显示,学会了Arduino用SPI通信方式控制外设。

Alice的博客 1万+

UIImageView异步加载网络图片

猴子原创,欢迎转载。转载请注明:转载自Cocos2D开发网--Cocos2Dev.com,谢谢! 原文地址:http://www.cocos2dev.com/?p=261 今天要在UIImageView中显示网络的图片,因为UIImageView自身就可以读取网络图片,所以,最简单的做法是: - (void)viewDidLoad { [super view...

mmdev 183

【Python程序开发】湖南省职业院校技能大赛python程序开发赛项样题二

【Python程序开发】湖南省职业院校技能大赛python程序开发赛项样题二

况老师话竞赛&blog 2196

ARC Semantic issue:No visiable @interface for xxx declares the selector yyy 与arc semantic issue

今天在使用cocoapods 的时候出现 使用更新了pod 库之后开始出现报错。 1、arc semantic issue ARC Semantic issue:No visiable @interface for xxx declares the selector yyy 如图是sdwebimage  出现的报错。接着发现在pod 的时候 出现这种原因是升级了

浅浅C的博客 2993

Tomcat启动过程中cmd窗口(控制台)中文乱码的问题

tomcat启动时,启动过程日志中文乱码的处理方法。

寻码启示 1942

41页PPT | 华为业务流程架构全景视图:全业务域L1-L3级流程全案

TBD、收集和生成线索、验证机会点、TBD、管理销售授权、管理销售项目、管理销售项目群、管理合同要素/模板、验证和分发线索、标前引导、管理开票和回款、客户网络评估、管理销售评审、TBD、管理交付项目群、管理合同文档、管理结构化合同信息、跟踪和培育线索、制定并提交标书、管理合同/PO变更、客户网络规划、管理销售决策。:4.1 管理技术、服务请求、4.2管理备件、服务交付、4.3管理非技术、服务请求、4.4管理客户、投诉。:管理Idea、产生Idea、激发兴趣与协作、孵化、原型和验证、确认Idea与商业化。

zuoan1993的博客 4548

异步加载图片-SDWebImage

异步加载图片-SDWebImageSDWebImage缓存原理1.UIImageView 加载//导入<UIImageView+WebCache.h> #import <UIImageView+WebCache.h>//placeholderImage加载过程中出现的图片 [_homeImageView sd_setImageWithURL:URL(source.imgUrl) placeholde

Galen_liang的博客 753

从零开始学习AI人工智能本体论:概念与实战

本文旨在为初学者提供一个全面而易于理解的人工智能本体论入门指南。我们将覆盖从基本概念到实际应用的全过程,帮助读者理解本体论在AI系统中的核心作用。核心概念与联系:介绍本体论的基本概念和原理核心算法与操作步骤:详细讲解本体构建和推理方法项目实战:通过实际案例展示本体论的应用实际应用场景:探讨本体论在不同领域的应用未来发展趋势:展望本体论在AI领域的前景本体论(Ontology): 在AI中,指对特定领域概念及其关系的明确形式化描述。

AI智能探索者的博客 867

SDWebImage使用——一个可管理远程图片加载的类库

SDWebImage使用——一个可管理远程图片加载的类库 SDWebImage托管在github上。https://github.com/rs/SDWebImage 这个类库提供一个UIImageView类别以支持加载来自网络的远程图片。具有缓存管理、异步下载、同一个URL下载次数控制和优化等特征。 将SDWebImage类库添加入工程时,一定注意需要添加MapKit.frame

任海丽(3G/移动开发) 1653

SI好文翻译:铜箔表面纹理对损耗的影响:一个有效的模型(一)

Paul G. Huray发表在DesignCon2010的提出铜箔表面雪球模型的论文。第一部分说明之前的铜箔表面模型只适用于5GHz以内,超过5GHz后就不再准确。

小孟同学的博客 2170

SAP 销售订单BOM使用场景简介

通常在MTO的生产场景中,我们会根据已创建的SO去展开BOM去驱动生产,如果我们生产地产品BOM是通用性的通常我们用标准BOM的方式就可以实现,但是实际在生产过程中往往不会这样,不同的客户对某些物料的规格就不相同,就会涉及产生不同的BOM,但是该客户的产品又不存在通用性,这个时候就会引入概念就是销售订单BOM,先有销售订单然后根据销售订单+行项目创建BOM。销售BOM:根据销售订单号+行项目号创建的BOM,是根据特定的销售订单或者可以理解为特定的客户创建的BOM。

我小时候很黑的博客 4219

iOS学习笔记46——图片异步加载之SDWebImage

在开发中经常会遇到列表加载的功能,其中大部分都包括图片列表加载,但移动设备本身内存有限,而大量图片加载又很耗内存。今天主要就介绍一个第三方图片异步加载库SDWebImage,Github地址为:https://github.com/rs/SDWebImage,这个库主要实现了为UIImageView添加一个类别方法,让使用者使用图片异步加载就好像直接为UIImageView设置image一样,使用...

v5browser 278

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

下一篇: KVC的优势
SMY_API
博客等级 码龄13年 5粉丝 16原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值