SDWebImage源代码梳理5#作者动机、修改目录、改变继承关系

作者在早期的readme中写到他的动机,当他刚开始写iOS的应用程序的时候,在UITbaleView上设置从web拿图片,苹果没有提供API。

作者当时搜索了很多的资料,大多数都是使用的NSURLConnection来实现的,这虽然能够工作,但是响应速度还是很慢,于是经过尝试,发现NSOperation来处理非常的快速,不会卡顿。

使用用户缓存目录而不是ducment目录,以防止缓存在iTunes中来回同步。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);

documents,应用中用户数据可以放在这里,iTunes备份和恢复的时候会包含此目录;

Library/Caches,存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出后被删除。

用一个UIImageView分类来替代BJCAWebImageView,这样集成的时候就更简单了。

 

//UIImageView+WebCache.h
#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface UIImageView (WebCache)

-(void)setImageWithURL:(NSURL *)url;

@end

NS_ASSUME_NONNULL_END
//UIImageView+WebCache.m
#import "UIImageView+WebCache.h"
#import "UIImageHlper.h"

@implementation UIImageView (WebCache)

-(void)setImageWithURL:(NSURL *)url
{
    UIImageHlper *helper = nil;
    if ([self.subviews count] > 0)
    {
        helper = [self.subviews objectAtIndex:0];
    }
    
    if (helper == nil)
    {
        helper = [[UIImageHlper alloc] initWithDelegate:self];
        [self addSubview:helper];
    }
    [helper cancel];
    
    if (helper.placeHolderImage == nil)
    {
        helper.placeHolderImage = self.image;
    }
    else
    {
        self.image = helper.placeHolderImage;
    }
    
    UIImage *cachedImage = [helper imageWithURL:url];
    if (cachedImage)
    {
        self.image = cachedImage;
    }
    else
    {
        [helper downloadWithURL:url];
    }
}

@end
//UIImageHlper.h
#import <UIKit/UIKit.h>
#import "BJCAWebImageDownloader.h"

NS_ASSUME_NONNULL_BEGIN

@interface UIImageHlper : UIView

{
    UIImageView *delegate;
    BJCAWebImageDownloader *downloader;
}

@property (nonatomic, strong) UIImage *placeHolderImage;

-(instancetype)initWithDelegate:(UIImageView *)aDelegate;
-(void)cancel;
-(UIImage *)imageWithURL:(NSURL *)url;
-(void)downloadWithURL:(NSURL *)url;

@end

NS_ASSUME_NONNULL_END
//UIImageHlper.m
#import "UIImageHlper.h"
#import "BJCAImageCache.h"

@implementation UIImageHlper

-(instancetype)initWithDelegate:(UIImageView *)aDelegate
{
    if(self = [super init])
    {
        delegate = aDelegate;
        self.hidden = YES;
    }
    return self;
}

-(UIImage *)imageWithURL:(NSURL *)url
{
    return [[BJCAImageCache sharedImageCache] imageFromKey:[url absoluteString]];
}

-(void)downloadWithURL:(NSURL *)url
{
    downloader = [BJCAWebImageDownloader downloaderWithURL:url target:self action:@selector(downloadFinishedWithImage:)];
}

-(void)downloadFinishedWithImage:(UIImage *)anImage
{
    delegate.image = anImage;
    [[BJCAImageCache sharedImageCache] storeImage:anImage forKey:[downloader.url absoluteString]];
    downloader = nil;
}

-(void)cancel
{
    [downloader cancel];
    downloader = nil;
}

@end

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Win_77

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值