• iOS网络图片缓存SDWebImage


    Web image(网络图像)

    该库提供了一个支持来自Web的远程图像的UIImageView类别

    它提供了:

    • 添加网络图像和缓存管理到Cocoa Touch framework的UIImageView类别
    • 异步图像下载
    • An asynchronous memory + disk image caching with automatic cache expiration handling
    • 支持GIF动画
    • 支持WebP格式
    • 后台图像解压
    • 保证相同的url不会下载多次
    • 保证伪造的URL不会尝试一遍又一遍的下载
    • 保证主线程永远不会被阻塞
    • Performances!
    • 使用GCD和ARC

    注意:SDWebImage 3.0不向后兼容2.0并且最低需要iOS 5.0 的版本。如果你的iOS版本低于5.0,请使用2.0版本



    如何使用

    API 文档地址 http://hackemist.com/SDWebImage/doc/

    Using UIImageView+WebCache category with UITableView

           仅需引入 UIImageView+WebCache.h 头文件,在UITableViewDataSource的方法tableView:cellForRowAtIndexPath:中调用setImageWithURL:placeholderImage:方法。从异步下载到缓存管理,一切都会为你处理。

    #import <SDWebImage/UIImageView+WebCache.h>
    
    ...
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *MyIdentifier = @"MyIdentifier";
    
        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 = @"My Text";
        return cell;
    }



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

    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

    Installation(安装)

    有两种方式使用SDWebImage:
    1.将文件全部拖入工程中;
    2.将工程作为一个静态库拖入工程中。

    Add the SDWebImage project to your project

    • Download and unzip the last version of the framework from the download page
    • Right-click on the project navigator and select "Add Files to "Your Project":
    • In the dialog, select SDWebImage.framework:
    • Check the "Copy items into destination group's folder (if needed)" checkbox

    Add dependencies(添加依赖性)

    • In you application project app’s target settings, find the "Build Phases" section and open the "Link Binary With Libraries" block:
    • Click the "+" button again and select the "ImageIO.framework"(还缺一个“MapKit.framework”,readme中没提到), this is needed by the progressive download feature:

    Add Linker Flag(添加链接标志)

         Open the "Build Settings" tab, in the "Linking" section, locate the "Other Linker Flags" setting and add the "-ObjC" flag:

    Import headers in your source files(导入头文件到你的资源文件中)

           在你需要用到这个库的资源文件中导入下面的头文件:
    #import <SDWebImage/UIImageView+WebCache.h>

    Build Project(编译工程

           这里你的工程应该是没有错误的。如果有,去google上找吧。


    Future Enhancements(未来增强功能)

           LRU memory cache cleanup instead of reset on memory warning

     

     
  • 相关阅读:
    React Children 使用
    Redux 中间件和异步操作
    Redux 核心概念
    React 的setState 异步理解
    JS 中类型和类型转换
    ES6 新增集合----- Set 和Map
    ES6 新增基本数据类型Symbol
    ES6 解构赋值
    ES6 对象增强
    ES6 中的let 和 const
  • 原文地址:https://www.cnblogs.com/yulang314/p/3712829.html
Copyright © 2020-2023  润新知