SDWebImage加载图片不显示的坑

近期在项目开发中发现使用SDWebImage加载图片不显示,所以去查了一波资料,大致整理了下。

SDWebImage 本身是有支持https的,所以我这边替换了加载图片的方法。具体原因应该是由于项目中使用了SSL证书导致的。

简单修改一个图片加载的问题:

-(void)sd_setImageWithURL:(NSURL )url placeholderImage:(UIImage )placeholder options:(SDWebImageOptions)options;

进入系统可以查看到options里面的选项
options:
//失败后重试

SDWebImageRetryFailed = 1 << 0,

//UI交互期间开始下载,导致延迟下载比如UIScrollView减速。

SDWebImageLowPriority = 1 << 1,

//只进行内存缓存
SDWebImageCacheMemoryOnly = 1 << 2,

//这个标志可以渐进式下载,显示的图像是逐步在下载
SDWebImageProgressiveDownload = 1 << 3,

//刷新缓存
SDWebImageRefreshCached = 1 << 4,

//后台下载
SDWebImageContinueInBackground = 1 << 5,
//NSMutableURLRequest.HTTPShouldHandleCookies = YES;
SDWebImageHandleCookies = 1 << 6,

//允许使用无效的SSL证书
//SDWebImageAllowInvalidSSLCertificates = 1 << 7,

//优先下载
SDWebImageHighPriority = 1 << 8,

//延迟占位符
SDWebImageDelayPlaceholder = 1 << 9,

//改变动画形象
SDWebImageTransformAnimatedImage = 1 << 10,

我们选用SSL证书即可解决;

当时由于考虑到其他项目也可能会遇到,但是如果修改起来不是很方便,所以我这边去查看了下其他解决方案就是我们去修改SDWebImage内部的函数;
我们找到 UIImageView+WebCache.m 这个文件,内部去修改

- (void)sd_setImageWithURL:(NSURL *)url {
    [self sd_setImageWithURL:url placeholderImage:nil options:SDWebImageAllowInvalidSSLCertificates progress:nil completed:nil];
}
- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder {
    [self sd_setImageWithURL:url placeholderImage:placeholder options:SDWebImageAllowInvalidSSLCertificates progress:nil completed:nil];
}

这样修改可以达到项目中只需要修改第三方库其他地方都不用修改。这样对于一个项目中多处使用SDWebImage的时候回方便很多。但是这种方法不建议团队使用,更不建议使用了cocoPods的项目使用。

当时在网上看到一个黑魔法是写一个image的分类,这样的话就不用去修改之前我们加载的图片了:

UIImageView+YJHttps.h

#import <UIKit/UIKit.h>
@interface UIImageView (YJHttps)
@end
UIImageView+YJHttps.m

#import "UIImageView+YJHttps.h"
#import <UIImageView+WebCache.h>
#import <objc/runtime.h>
@implementation UIImageView (YJHttps)
+ (void)load {
    Class myClass = [self class];
    
    // 获取SEL
    SEL originSetImageSel = @selector(sd_setImageWithURL:placeholderImage:options:progress:completed:);
    SEL newSetImageSel = @selector(sd_setHttpsImageWithURL:placeholderImage:options:progress:completed:);
    
    // 生成Method
    Method originMethod = class_getInstanceMethod(myClass, originSetImageSel);
    Method newMethod = class_getInstanceMethod(myClass, newSetImageSel);
    
    // 交换方法实现
    method_exchangeImplementations(originMethod, newMethod);
}
- (void)sd_setHttpsImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock {
    NSLog(@"这里实现了");
    
    [self sd_setHttpsImageWithURL:url placeholderImage:placeholder options:SDWebImageAllowInvalidSSLCertificates progress:progressBlock completed:completedBlock];
}
@end

但是在分享会上同事说:方法替换黑魔法在项目里面不建议使用太多,它会捣乱方法现有的调用顺序,如果放到某个基类里面,就要慎重了,出bug的话调试起来会很绕的

所以分享会上同事也提出了更好的一个办法就是写一个分类,里面将加载图片你的函数换个名字,然后全局替换项目中使用的地方,这样我们的改动也会很小,但是起到的效果应该是很好的。

以上4中方法仅供参考。如果有好的方法也可留言下来,我会再次整理。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AGI阅读 16,003评论 3 119
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,547评论 8 265
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,135评论 1 32
  • 2016年已经进入到尾声,这一年自己经历了很多很多,真不知用什么形容词来形容最合适。作为一个简单直接的人还...
    落雪飞花yjy阅读 290评论 0 1
  • 呜呼零八,异于同往,心血俱动,诚不敢忘,遂以作文以记之。 鸿篇新叶,年中戊子,此间有悲欢离合。先闻南国雪霜,又接汶...
    蒙阳邱子阅读 315评论 1 2