美文网首页
SDWebImage加载图片不显示的坑

SDWebImage加载图片不显示的坑

作者: 小古要哈哈 | 来源:发表于2018-06-15 16:25 被阅读0次

    近期在项目开发中发现使用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中方法仅供参考。如果有好的方法也可留言下来,我会再次整理。

    相关文章

      网友评论

          本文标题:SDWebImage加载图片不显示的坑

          本文链接:https://www.haomeiwen.com/subject/udsmeftx.html