zoukankan      html  css  js  c++  java
  • 使用开源库 SDWebImage 异步下载缓存图片(持续更新)

    source  https://github.com/rs/SDWebImage

    APIdoc  http://hackemist.com/SDWebImage/doc

    Asynchronous image downloader with cache support with an UIImageView category

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

    This library provides a category for UIImageVIew with support for remote images coming from the web.

    这个库给UIImageView提供类目,支持远程下载图片(从网络上)

    It provides:

    • An UIImageView category adding web image and cache management to the Cocoa Touch framework
    • An asynchronous image downloader
    • An asynchronous memory + disk image caching with automatic cache expiration handling
    • Animated GIF support
    • WebP format support
    • A background image decompression
    • A guarantee that the same URL won't be downloaded several times
    • A guarantee that bogus URLs won't be retried again and again
    • A guarantee that main thread will never be blocked
    • Performances!
    • Use GCD and ARC
    • Arm64 support
    • 一个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;
        }

    -未完待续-

  • 相关阅读:
    ADB命令大全
    Backup your Android without root or custom recovery -- adb backup
    Content portal for Pocketables Tasker articles
    Is there a way to detect if call is in progress? Phone Event
    Tasker to proximity screen off
    Tasker to detect application running in background
    Tasker to create toggle widget for ES ftp service -- Send Intent
    Tasker to proximity screen on
    Tasker to answer incoming call by pressing power button
    Tasker to stop Poweramp control for the headset while there is an incoming SMS
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/3604851.html
Copyright © 2011-2022 走看看