博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS网络编程(三) 异步加载及缓存图片---->SDWebImage
阅读量:4628 次
发布时间:2019-06-09

本文共 6867 字,大约阅读时间需要 22 分钟。

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

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

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

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

 

[objc] 
 
  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. }  

 

       查看图片是否进了缓存:

 

@得到1个图片的url用SDWebImage缓存后的文件名

[objc] 
 
  1. NSLog(@"%s__%d__|%@",__FUNCTION__,__LINE__,[[SDImageCache sharedImageCache] cachedFileNameForKey:@"http://c.hiphotos.baidu.com/image/w%3D2048/sign=396e9d640b23dd542173a068e531b2de/cc11728b4710b9123a8117fec1fdfc039245226a.jpg"]);  

 

 

@其他

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

      http://blog.csdn.net/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不会被调用(无论成功还是失败)。
 

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

 

 

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(添加进度指示)

查看这个类别: 

 

 

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

转载于:https://www.cnblogs.com/yjg2014/p/3835170.html

你可能感兴趣的文章
POJ-1185 炮兵阵地 动态规划+状态压缩
查看>>
NYOJ 366 D的小L
查看>>
PYTHON 写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者...
查看>>
Docker 初识
查看>>
【12.16】VC++调用Word OLE进行自动化生成报表
查看>>
用Maven创建第一个web项目
查看>>
php中的抽象类(abstract class)和接口(interface)
查看>>
linux安装ActiveMQ
查看>>
面向对象与软件工程---团队作业1
查看>>
认识一下Kotlin语言,Android平台的Swift
查看>>
hdu5389 Zero Escape
查看>>
【转】android电池(四):电池 电量计(MAX17040)驱动分析篇
查看>>
android中的回调
查看>>
redis启动、清缓存命令
查看>>
Java的Clone
查看>>
CSS 弹出层 支持IE/FF/OP
查看>>
maven的配置-2019-4-13
查看>>
进程调度
查看>>
百练 2973 Skew数 解题报告
查看>>
C# 温故而知新:Stream篇(二)
查看>>