iOS开发 SDWebImage中那些好用的方法

http://www.wugaojun.com/blog/2015/06/20/sdwebimagezhong-na-xie-hao-yong-de-fang-fa/


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缓存的图片,在磁盘上占用的空间。

裁剪图片

- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock;

#pragma mark - 裁剪图片

- (void)yg_setTrimImageWithUrl:(NSString *)url placeholderImage:(UIImage *)placeholder{

    __weak typeof(self) ws = self;
        [SDWebImageManager sharedManager].imageCache.shouldCacheImagesInMemory = NO;

    [self sd_setImageWithURL:[NSURL URLWithString:url] placeholderImage:placeholder completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
        if (image) {
            UIImage *img=[self yg_trimImageWithImage:image];
            ws.image=img;
        }else{
            ws.image =[self yg_trimImageWithImage:placeholder];
        }
    }];
}

-(UIImage *)yg_trimImageWithImage:(UIImage *)image{

    //imageView的宽高比
    CGFloat imageViewWidthHeightRatio =self.frame.size.width/self.frame.size.height;
    //屏幕分辨率
//    CGFloat imageScale = [[UIScreen mainScreen] scale];

    CGFloat imageScale = 1;

    CGFloat imageWith = image.size.width*imageScale;

    CGFloat imageHeight =image.size.height*imageScale;

    //image的宽高比
    CGFloat imageWidthHeightRatio =imageWith/imageHeight;

    CGImageRef imageRef = nil;

    CGRect rect;

//    NSLog(@"\nimageWith === %f\nimageHeight === %f\nImageView宽高比 == %f\nimageScale == %f",imageWith,imageHeight,imageViewWidthHeightRatio,imageScale);


    if (imageWidthHeightRatio>imageViewWidthHeightRatio) {

        rect = CGRectMake((imageWith-imageHeight*imageViewWidthHeightRatio)/2, 0, imageHeight*imageViewWidthHeightRatio, imageHeight);

    }else if (imageWidthHeightRatio<imageViewWidthHeightRatio) {

        rect = CGRectMake(0, (imageHeight-imageWith/imageViewWidthHeightRatio)/2, imageWith, imageWith/imageViewWidthHeightRatio);

    }else {
        rect = CGRectMake(0, 0, imageWith, imageHeight);
    }

    imageRef = CGImageCreateWithImageInRect([image CGImage], rect);
    UIImage *res = [UIImage imageWithCGImage:imageRef scale:imageScale orientation:UIImageOrientationUp];

    /**
     一定要,千万要release,否则等着内存泄露吧,稍微高清点的图一张图就是几M内存,很快App就挂了
     */
    CGImageRelease(imageRef);

    return res;
}



其他给力方法

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!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iOS开发,有许多常用的库和框架可以帮助开发者提高效率和加速开发过程。以下是一些常用的库和框架: 1. Alamofire:一个简洁的网络请求库,提供了一种优雅的方式来进行网络请求和处理响应。 2. SDWebImage:一个用于异步加载和缓存网络图片的库,可以帮助提高图片加载性能,并且具有内存和磁盘缓存机制。 3. AlamofireImage:一个基于Alamofire的图片加载库,提供了一些便捷的方法来加载网络图片并进行缓存。 4. SwiftyJSON:一个轻量级的、灵活的JSON解析库,可以帮助简化处理JSON数据的过程。 5. SnapKit:一个优雅的、轻量级的Auto Layout框架,使用Swift语言提供了一种简化UI布局代码的方式。 6. Realm:一个移动数据库框架,提供了高效的数据存储和查询功能,并且支持对象关系映射(ORM)。 7. AlamofireObjectMapper:一个将Alamofire与ObjectMapper结合使用的库,可以方便地将JSON数据映射到模型对象。 8. Kingfisher:一个用于异步加载和缓存网络图片的库,具有高性能和功能丰富的特点。 9. RxSwift:一个用于响应式编程的库,可以简化异步编程和事件处理的复杂性。 10. IQKeyboardManager:一个用于处理键盘弹出和收起的库,可以自动管理键盘,提供了一种简单的方式来避免键盘遮挡输入框的问题。 这只是一小部分常用的库和框架,iOS开发还有许多其他优秀的工具可供选择,根据具体需求选择合适的库和框架进行开发
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值