zoukankan      html  css  js  c++  java
  • SDWebImage 新版接口使用方法

    最新的库结构如下

    初次导入,如果你的 Xcode 不是最新的,可能会遇到问题,解决版本

    (1) 下载了SDWebImage.framework,然后拖到了工程中,然后:

    #import "UIImageView+WebCache.h"

    死活import不进啊,提示"UIImageView+WebCache.h file not found"

    解决方法,最新版本的SDWebImage需要import的不是上面那一句了,需要:

    #import<SDWebImage/UIImageView+WebCache.h>

    然后build,一切OK。

    (2) 另外一个问题就是:

    Symbol Not Found: _objc_storeStrong

    因为在no arc项目中引用了arc 的SDWebImage,更改一下: Build Settings->Other Linker Flags 添加 -fobjc-arc.

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

    第一步,在需要的地方导入头文件

    #import<SDWebImage/UIImageView+WebCache.h>

    第二步,调用sd_setImageWithURL:方法缓存图片,注意,这就是新版本的新方法,旧方法是 setImageWithURL : 。下面将几个方法都介绍一下。

    //1 图片缓存的基本代码,就是这么简单
        [self.image1 sd_setImageWithURL:imagePath1];

    //2 用block 可以在图片加载完成之后做些事情
        [self.image2 sd_setImageWithURL:imagePath2 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
            
            NSLog(@"这里可以在图片加载完成之后做些事情");
            
        }];

    //3 给一张默认图片,先使用默认图片,当图片加载完成后再替换
        [self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@"default"]];
     
    //4 使用默认图片,而且用block 在完成后做一些事情
        [self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@"default"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
            
            NSLog(@"图片加载完成后做的事情");
            
        }];

    //5 options 选择方式
        
        [self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@"default"] options:SDWebImageRetryFailed];
     
     

    除了带options选项的方法,其他的方法都是综合存储,也就是内存缓存和磁盘缓存结合的方式,如果你只需要内存缓存,那么在options这里选择SDWebImageCacheMemoryOnly就可以了。

    当你调用 setImageWithURL: 方法的时候,他会自动去给你干这么多事,当你需要在某一具体时刻做事情的时候,你可以覆盖这些方法。比如在下载某个图片的过程中要响应一个事件,就覆盖这个方法:

    //覆盖方法,指哪打哪,这个方法是下载imagePath2的时候响应
      SDWebImageManager *manager = [SDWebImageManager sharedManager];
      [manager downloadImageWithURL:imagePath2 options:SDWebImageRetryFailed progress:^(NSInteger receivedSize, NSInteger expectedSize) {
        NSLog(@"显示当前进度");
      } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
        NSLog(@"下载完成");
      }];

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

    如果想取出 SD 缓存在本地的图片,可以使用下面代码

    NSURL *url = [NSURL URLWithString:[model.content objectForKey:@"image"]];
                //请求网络地址数据的同步方法
                //因为这个方法在子线程(全局队列)中执行,所以不需要考虑死线程的问题
                SDWebImageManager *manager = [SDWebImageManager sharedManager];
                 [manager diskImageExistsForURL:url];
                if ([manager diskImageExistsForURL:url]) {
                    LOG(@"11111")
                    self.speakImage = [[manager imageCache] imageFromDiskCacheForKey:url.absoluteString];
                }else{
                    LOG(@"3333333")
                    NSData *data = [NSData dataWithContentsOfURL:url];
                    self.speakImage = [UIImage imageWithData:data];
                }

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

    SDWebImage 在从 URL 获取超过 2 m 的图片时,会造成在内存小的机器上闪退,解决方法,重写一下内置的方法

    如上图中的 UIImage+MultiFormat.m 中

    + (UIImage *)sd_imageWithData:(NSData *)data {
        UIImage *image;
        NSString *imageContentType = [NSData sd_contentTypeForImageData:data];
        if ([imageContentType isEqualToString:@"image/gif"]) {
            image = [UIImage sd_animatedGIFWithData:data];
        }
    #ifdef SD_WEBP
        else if ([imageContentType isEqualToString:@"image/webp"])
        {
            image = [UIImage sd_imageWithWebPData:data];
        }
    #endif
        else {
            image = [[UIImage alloc] initWithData:data];
            UIImageOrientation orientation = [self sd_imageOrientationFromImageData:data];
            if (orientation != UIImageOrientationUp) {
                image = [UIImage imageWithCGImage:image.CGImage
                                            scale:image.scale
                                      orientation:orientation];
            }
        }
    
    //------------------------------------------------------------
    // 这里是修改的代码,根据不同屏幕尺寸对图片进行裁切,使内存中图片占用较小
    //------------------------------------------------------------
    float width = 0.0; switch ((int)[UIScreen mainScreen].bounds.size.width) { case 320: width = 640.0; break; case 375: width = 750.0; break; case 414: width = 1242.0; break; default: width = 640.0; break; } //对网络图片进行缩放 float scaleSize = width/image.size.width; if (scaleSize < 1) { UIGraphicsBeginImageContext(CGSizeMake(image.size.width * scaleSize, image.size.height * scaleSize)); [image drawInRect:CGRectMake(0, 0, image.size.width * scaleSize, image.size.height * scaleSize)]; UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return scaledImage; } return image; }

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

    SDWebImageDownloader

    这个下载器改版很大,现在里面就一个方法,就是发起前往下载图片的函数:

        [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:imageUrl options:SDWebImageDownloaderProgressiveDownload progress:^(NSUInteger receivedSize, long long expectedSize) {  
            NSLog(@"%u %lld",receivedSize,expectedSize);  
        } completed:^(UIImage *aImage, NSData *data, NSError *error, BOOL finished) {  
            //self.image = aImage;  
            NSLog(@"成功了:%d",UIImageJPEGRepresentation(aImage, 1).length);  
        }];  

    进度Block返回的信息有两个参数:1:下载进度. 2:文件大小.

     

    我这里解释一下里面的options枚举的作用

    SDWebImageDownloaderOptions

    1:SDWebImageDownloaderLowPriority

      这个属于默认的使用模式了,前往下载,返回进度Block信息,完成时调用completedBlock

    2:SDWebImageDownloaderProgressiveDownload

      这个是新版本加的功能,设置后,在返回进度Block的同时,返回completedBlock,里面的UIImage就是当前下载时的图片,可以实现将图片一点点显示出来的功能.

    那么SDWebImageDownloader 在新版本的中的分工很明确,只做一件事情,那就是下载,只是下载而已,所以,下载成功以后的图片资源是不会自动缓存的.

    如果要缓存,这里需要使用到

    SDImageCache

    SDImageCacheType 当下载请求结束时,通过这个枚举来告知图片的来源

    1:SDImageCacheTypeNone     网络
    
    2:SDImageCacheTypeDisk     设备硬盘
    
    3:SDImageCacheTypeMemory   内存

    将上面两步骤的需求合并可直接使用

    SDWebImageManager

    新版本的管理类的改动也相当大,而且就一个方法了,如下:

     

         [[SDWebImageManager sharedManager] downloadWithURL:imageUrl options:SDWebImageLowPriority progress:^(NSUInteger receivedSize, longlong ,UIImageJPEGRepresentation(aImage, 1).length);  
        }];  

    这样发起的下载请求,就会自动缓存图片资源了.


    那么任何发起的下载请求,都会返回一个代理. 这个写法很神奇,值得深究啊.

    也就是:SDWebImageOperation 将这个委托缓存一下,做什么用呢?一件事情,取消下载请求.


     

    这边文章介绍了整个SDWebImage的运作原理, 真TMD 的复杂

    http://blog.csdn.net/uxyheaven/article/details/7909373





  • 相关阅读:
    maven scope取值
    HashMap 解析
    MySQL中int(M)和tinyint(M)数值类型中M值的意义
    PyCharm 快捷键
    js 闭包,原型链,作用域链
    阿拉伯数字转中文大写金额JS(JavaScript方法)
    JSch
    Java面试点 -【笔记】
    tomcat Connector配置项 参数优化说明
    QRCanvas 示例使用
  • 原文地址:https://www.cnblogs.com/allanliu/p/4566420.html
Copyright © 2011-2022 走看看