SDWebImage源代码梳理3#删除下载器和缓存之间不必要的耦合

https://github.com/DYS12345/SDWebImage-/tree/dev

075e91eca8abaf866d9adc628acb3f3637c3e9d5

这一次更新重点是将readme文件进行了调整,里面关于LRU的算法,可以看一下,也是收到内存警告的时候,如何去清理内存。

https://github.com/DYS12345/SDWebImage-/tree/dev

0ccc5b5bd2300a0e8f8b60038f1e7da38ac4b466

接下来的一次修改提交,修改了三个地方:

DMWebImageDownloader.m文件:

  1. 把图像存储部分去掉了;
  2. 将下载队列的名称进行了更改;
#import "BJCAWebImageDownloader.h"
#import <UIKit/UIKit.h>

static NSOperationQueue *downloadQueue; 

@implementation BJCAWebImageDownloader

@synthesize url, target, action;

+(id)downloaderWithURL:(NSURL *)url target:(id)target action:(SEL)action
{
    BJCAWebImageDownloader *downloader = [[BJCAWebImageDownloader alloc] init];
    downloader.url = url;
    downloader.target = target;
    downloader.action = action;
    
    if (downloadQueue == nil)
    {
        downloadQueue = [[NSOperationQueue alloc] init];
        downloadQueue.maxConcurrentOperationCount = 8;
    }
    [downloadQueue addOperation:downloader];
    return downloader;
}

+(void)setMaxConcurrentDownloads:(NSUInteger)max
{
    if (downloadQueue == nil)
    {
        downloadQueue = [[NSOperationQueue alloc] init];
    }
    downloadQueue.maxConcurrentOperationCount = max;
}

-(void)main
{
    @autoreleasepool
    {
        UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];
        if (!self.isCancelled)
        {
            [target performSelector:@selector(action) withObject:image];
        }
    }
}

@end

DMWebImageView.h文件进行了修改:

  1. 将下载类的实例名字进行了修改;
#import <UIKit/UIKit.h>

@class BJCAWebImageDownloader;

NS_ASSUME_NONNULL_BEGIN

@interface BJCAWebImageView : UIImageView

{
    UIImage *placeHolderImage;
    BJCAWebImageDownloader *downloader;
}

-(void)setImageWithURL:(NSURL *)url;
-(void)downloadFinishedWithImage:(UIImage *)image;

@end

NS_ASSUME_NONNULL_END

BJCAWebImageView.m文件进行了以下修改:

  1. 下载实例对象的名字进行了修改;
  2. 在图像下载完成的方法中添加了图像存储的操作;
#import "BJCAWebImageView.h"
#import "BJCAImageCache.h"
#import "BJCAWebImageDownloader.h"

@implementation BJCAWebImageView

#pragma mark RemoteImageView
-(void)setImageWithURL:(NSURL *)url
{
    if (downloader != nil)
    {
        [downloader cancel];//从队列中删除
        downloader = nil;
    }
    //保存占位图图像,以便在视图被重用的时候重新应用占位图
    if (placeHolderImage == nil)
    {
        placeHolderImage = self.image;
    }
    else
    {
        self.image = placeHolderImage;
    }
    //完整的url字符串当做key
    UIImage *cachedImage = [[BJCAImageCache sharedImageCache] imageFromKey:[url absoluteString]];
    if (cachedImage)
    {
        self.image = cachedImage;
    }
    else
    {
        downloader = [BJCAWebImageDownloader downloaderWithURL:url target:self action:@selector(downloadFinishedWithImage:)];
    }
}

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

@end

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Win_77

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

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

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

打赏作者

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

抵扣说明:

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

余额充值