SDWebImage 使用

原文地址:http://www.cnblogs.com/YouXianMing/p/3604851.html

 

UIImageView的类目,支持异步图片下载,支持缓存机制

SDWebImage库给UIImageView提供类目,支持远程下载图片(从网络上),功能如下:

  • 一个UIImageView的类目,给 Cocoa Touch 框架添加了异步下载远程图片以及管理图片缓存的功能
  • 一个图片的异步下载器
  • 一个内存 + 磁盘的缓存机制,并自动管理
  • gif动画支持
  • WebP格式支持
  • 后台解压图片
  • 确保同样地 URL 不会重复的下载多次
  • 确保无效的 URL 不会重复的链接
  • 确保主线程永远不会阻塞
  • 效果拔群!
  • 使用GCD以及要求ARC
  • 支持64位系统

以下进行SDWebImage使用的教程解说.

1. 从地址 https://github.com/rs/SDWebImage 下载源码,将源码包中得 SDWebImage 文件夹拖入你的工程当中.

2. 头文件较多,请新建一个 SDWebImage.h 的头文件,写以下代码并包含所有头文件,添加到.pch文件中

-------------------------------------------------------------------------------

//MKAnnotationView地图的注解View缓存
#import "MKAnnotationView+WebCache.h"

//判断NSData是否什么类型的图片(例如:jpg,png,gif)
#import "NSData+ImageContentType.h"

//是SDWebImage包的一部分
#import "SDImageCache.h"      //缓存相关
#import "SDWebImageCompat.h"  //组件相关
#import "SDWebImageDecoder.h" //解码相关

//图片下载以及下载管理器
#import "SDWebImageDownloader.h"
#import "SDWebImageDownloaderOperation.h"

//管理以及操作
#import "SDWebImageManager.h"
#import "SDWebImageOperation.h"

//UIButton类目
#import "UIButton+WebCache.h"

//gif类目
#import "UIImage+GIF.h"

//图片其他类目
#import "UIImage+MultiFormat.h"
#import "UIImage+WebP.h"
#import "UIImageView+WebCache.h"

-------------------------------------------------------------------------------

3. 正式开始讲解怎么使用

独立的下载图片的功能(没有缓存机制)

复制代码
    NSString *oneImageURL =
    @"http://wallpapers.wallbase.cc/rozne/wallpaper-573934.jpg";
    
    [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:[NSURL URLWithString:oneImageURL]
                                                          options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) { //此处为下载进度  } completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { //下载完成后进入这里执行 }];
复制代码

分析:此方法为单例模式,看其源码

+ (SDWebImageDownloader *)sharedDownloader {
    static dispatch_once_t once;
    static id instance;
    dispatch_once(&once, ^{
        instance = [self new];
    });
    return instance;
}

- (id)init {
    if ((self = [super init])) {
        _executionOrder = SDWebImageDownloaderFIFOExecutionOrder;
        _downloadQueue = [NSOperationQueue new];
        _downloadQueue.maxConcurrentOperationCount = 2;
        _URLCallbacks = [NSMutableDictionary new];
        _HTTPHeaders = [NSMutableDictionary dictionaryWithObject:@"image/webp,image/*;q=0.8" forKey:@"Accept"];
        _barrierQueue = dispatch_queue_create("com.hackemist.SDWebImageDownloaderBarrierQueue", DISPATCH_QUEUE_CONCURRENT);
        _downloadTimeout = 15.0;
    }
    return self;
}

typedef NS_ENUM(NSInteger, SDWebImageDownloaderExecutionOrder) {
    /**
     * Default value. All download operations will execute in queue style (first-in-first-out). 默认值.所有的下载操作将会进入串行线程池FIFO
     */
    SDWebImageDownloaderFIFOExecutionOrder,

    /**
     * All download operations will execute in stack style (last-in-first-out).
     */
    SDWebImageDownloaderLIFOExecutionOrder
};

如果仅仅看上面的部分,知道下载单例由串行线程池管理着,按照队列执行,一次最多能执行两个,但我在实际测试过程中发现,并不像描述的那样子......,好吧,就当做是并发执行的了(此处疑问有时间再解决)

独立的下载图片的功能(有缓存机制)

复制代码
    NSString *oneImageURL =
    @"http://pic.cnitblog.com/avatar/607542/20140226182241.png";
    
    [[SDWebImageManager sharedManager] downloadWithURL:[NSURL URLWithString:oneImageURL]
                                               options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) { //此处为下载进度  } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished) { //下载完成后进入这里执行 }];
复制代码

清除缓存文件

    [[SDImageCache sharedImageCache] clearDisk];

判断本地缓存中是否存在网络中的图片

    NSString *imageNetURL = @"http://pic.cnitblog.com/avatar/607542/20140226182241.png";
    [[SDImageCache sharedImageCache] diskImageExistsWithKey:imageNetURL];

获取缓存图片张数

    [[SDImageCache sharedImageCache] getDiskCount];

获取所有缓存图片的总大小

    [[SDImageCache sharedImageCache] getSize];

直接从缓存中提取图片

    NSString *imageNetURL = @"http://pic.cnitblog.com/avatar/607542/20140226182241.png";
    [[SDImageCache sharedImageCache] imageFromDiskCacheForKey:imageNetURL];

直接删除缓存中得图片

    NSString *imageNetURL = @"http://pic.cnitblog.com/avatar/607542/20140226182241.png";
    [[SDImageCache sharedImageCache] removeImageForKey:imageNetURL];

在UITableView中使用

复制代码
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *MyIdentifier = @"Y.X."; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease]; } // 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"]]; cell.textLabel.text = @"Y.X."; return cell; }
复制代码

转载于:https://www.cnblogs.com/liudongyan/p/4375460.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值