zoukankan      html  css  js  c++  java
  • SDWebImage 常用方法

    SDWebImage是iOS中一款处理图片的框架, 使用它提供的方法, 一句话就能让UIImageView自动去加载并显示网络图片。特别是在UITableViewCell中有UIImageView需要显示来自网络的图片。SDWebImage会自动去管理这些图片, 包括缓存到内存和缓存到磁盘等等。包括gif图片的显示也是轻松完成。本文主要分享除了基本方法以外的一些其他给力方法。

    图片下载

    图片下载有两种方式。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    // 方法1:
    [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:url options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
        // 下载进度block
        } completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) {
        // 下载完成block
    }];
    
    // 方法2:
    [[SDWebImageManager sharedManager] downloadImageWithURL:url options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
        // 下载进度block
        } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
        // 下载完成block
    }];
    

    以上两个方法可以下载图片,但是肯定是有差别的。相同点就不详细说了,都提供下载进度回调和下载完成回调,主要说说不同点。

    • 方法1和方法2是两个不同的类,方法1(SDWebImageDownloader)只下载图片,不管理图片,不会缓存图片到内存和本地。方法2(SDWebImageManager) 既下载图片,又管理图片。其实方法2内部也是调用的方法1。只不过方法2会缓存图片,并且管理下载队列。
    • 下载完成之后的回调传递的参数不一样,方法1会将图片的NSData数据和传过来,而方法2只传递了image对象。
    • 方法1的completed回调不是在主线程,如果需要在主线程做事情,得手动回到主线程。方法2的completed回调是主线程,在做进一步处理时就不用再手动回到主线程了。

    图片存储(SDImageCache类)

    可以将手动将图片通过SDWebImage存储,由SDWebImage统一管理。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    /**
     * 方法1
     * @param key    图片的url路径
     * @param toDisk 是否要缓存到磁盘
     */
    - (void)storeImage:(UIImage *)image forKey:(NSString *)key toDisk:(BOOL)toDisk;
    
    /**
     * 方法2
     * @param recalculate 是否需要将image转换为data 
     * @param imageData   图片的NSData对象
     */
    - (void)storeImage:(UIImage *)image recalculateFromImage:(BOOL)recalculate imageData:(NSData *)imageData forKey:(NSString *)key toDisk:(BOOL)toDisk;
    

    以上是两个比较有代表性的方法

    • 方法1只能存储png或者jpg图片,不能存储gif图片,方法内部会对image对象进行转换,然后写到本地。
    • 方法2就比较给力了,因为提供了imageData参数,可以将图片的NSData对象传过去,什么类型的图片都可以存储。这里需要注意的是,如果提供了imageData, 那么recalculate传递NO就可以了, 方法内部就不会再拿UIImage对象去转换成NSData对象了了。

    获取缓存图片的路径

    有时候可能需要拿到缓存图片的路径做做一些事情,SDWebImage也提供了相应的方法。

    1
    2
    
    // url是图片的网络路径
    NSString *imageCachePath = [[SDImageCache sharedImageCache] defaultCachePathForKey:url];
    

    获取缓存图片

    1
    2
    
    // url是图片的网络路径
    UIImage *image = [[SDImageCache sharedImageCache] imageFromDiskCacheForKey:src];
    

    调用这个方法时,SDImageCache会先到内存中查找图片,如果没找到,再到磁盘上找。

    获取缓存占用空间

    1
    
    [[SDImageCache sharedImageCache] getSize];
    

    这个方法会直接返回通过SDWebImage缓存的图片,在磁盘上占用的空间。

    其他给力方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    @interface UIImage (MultiFormat)
    // 这个方法牛逼的地方在于,能加载gif图片。会根据data的类型采用不同的加载方法
    + (UIImage *)sd_imageWithData:(NSData *)data;
    @end
    
    @interface NSData (ImageContentType)
    // 根据data拿到图片的后缀,形如@"image/jpeg",@"image/png",@"image/gif"
    + (NSString *)sd_contentTypeForImageData:(NSData *)data;
    @end
    

    Done!

    转载请注明出处:http://duwei.cnblogs.com/
  • 相关阅读:
    C#移动及改变控件大小
    flutter学习(状态组件,组件)
    dart学习1
    rn的优化
    git命令
    Immutable
    树形数据结构的搜索功能
    promise
    js出场率极高的代码
    js浮点数计算精度解决方案
  • 原文地址:https://www.cnblogs.com/duwei/p/5006903.html
Copyright © 2011-2022 走看看