美文网首页
iOS SDWebImgae Cache原理

iOS SDWebImgae Cache原理

作者: 9岁就很6 | 来源:发表于2019-02-22 11:28 被阅读2次

写这篇文章的原因,作为开发者也有好几年了,曾有对著名第三方SDWebImgae做一个简单的研究,今天就把当初研究写的Demo和原理分享给大家,面试曾遇到过哦~

一、创建一个继承NSObject的工具类DownImageManager

点h实现

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface DownImageManager : NSObject
{
    //创建一个内存字典
    NSMutableDictionary * _memoryDict;
    
}
//创建一个单例类

+(DownImageManager *)shareManager;


//从内存中找
-(UIImage *)getImageFromMemoryWithUrl:(NSString *)urlStr;
//从沙盒中找
-(UIImage *)getImageFromSendBoxWithUrl:(NSString *)urlStr;

//网络下载
-(void)downImageFromNetWorkWithUrl:(NSString *)url imageView:(UIImageView *)imageView;



@end

点m实现

#import "NSString+Addtions.h"
#import "Base64.h"
DownImageManager * _downManager;

//NSOperationQueue * queue;

@implementation DownImageManager


#pragma mark -------只初始化一次,单例列
+(DownImageManager *)shareManager{
    
    
    static dispatch_once_t once;
    dispatch_once(&once, ^{
        _downManager = [[DownImageManager alloc]init];
    });
    return _downManager;
    
}
//返回当前类的对象instancetype
-(instancetype)init{
    
    self= [super init];
    if (self) {
        _memoryDict = [[NSMutableDictionary alloc ]init];
    }
    return self;
}
//存到内存
-(UIImage *)getImageFromMemoryWithUrl:(NSString *)urlStr{

    UIImage *image = _memoryDict[urlStr];
    
    return image;
}
//存到沙盒文件夹下
-(UIImage *)getImageFromSendBoxWithUrl:(NSString *)urlStr{
    
    NSString * path = [NSString getFilePathWithDir:@"Documents/huangshiwen" file:[urlStr base64EncodedString]];
    
    //从沙盒文件夹下找图片
    UIImage *image= [UIImage imageWithContentsOfFile:path];
    
    //如果有图片就存起来
    if (image) {
        [_memoryDict setObject:image forKey:urlStr];
    }
    return  image;
}

//网络下载
-(void)downImageFromNetWorkWithUrl:(NSString *)url imageView:(UIImageView *)imageView{
    
    NSDictionary * dict =@{@"url":url,@"imageView":imageView};
    
    NSInvocationOperation * operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(loadImage:) object:dict];
    
    NSOperationQueue * queue = [[NSOperationQueue alloc]init];
    //执行
    [queue addOperation:operation];
    
    
}
-(void)loadImage:(NSDictionary *)dict{
    
    //从字典找键值对(图片 网址 )
    
    NSURL *url = [NSURL URLWithString:dict[@"url"]];
    
    UIImageView *imageView = dict[@"imageView"];
    
    //开始转换
    
    NSData * data =[NSData dataWithContentsOfURL:url];
    UIImage * image = [UIImage imageWithData:data];
    
    //开始回到主线程刷新ui
    dispatch_async(dispatch_get_main_queue(), ^{
        //如果下载好了
        if (image) {
             //存入内存字典
            [_memoryDict setObject:image forKey:dict[@"url"]];
            //存入沙盒文件
            NSString *path = [NSString getFilePathWithDir:@"Documents/huangshiwen" file:[dict[@"url"] base64EncodedString]];
            
            //数据持久化存储
            [data writeToFile:path atomically:YES];
            
            //显示
            imageView.image = image;
            
        }
    });
 
}
@end

二、新建一个UIImageView的category (UIImageView+Addtition.h)

#import <UIKit/UIKit.h>

@interface UIImageView (Addtition)


//扩展类方法
-(void)setImageWithUrl:(NSString *)urlStr;

//
-(void)setimageWithUrl:(NSString *)urlStr placeHolderImage:(UIImageView *)image;


@end

#import "UIImageView+Addtition.h"
#import "DownImageManager.h"
@implementation UIImageView (Addtition)

#pragma mark --------imageUrl
-(void)setImageWithUrl:(NSString *)urlStr{
    
 DownImageManager * manager  = [DownImageManager shareManager];
    
    UIImage * image = [manager getImageFromMemoryWithUrl:urlStr];
    
   
    
    
    //存在内存
    if (image) {
        self.image= image;
        return;
    }
    //本地沙盒
    image = [manager getImageFromSendBoxWithUrl:urlStr];
    if (image) {
        self.image=image;
        return;
    }
    //加载网络
//    self 当前调用这个方法的对象(当前类的对象)
    
    [manager downImageFromNetWorkWithUrl:urlStr imageView:self];
    
}


#pragma mark ========占位图
-(void)setimageWithUrl:(NSString *)urlStr placeHolderImage:(UIImage *)image{
    
    self.image =image;
    [self setImageWithUrl:urlStr];
    
}
@end

三、使用


- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self.imageView1 setImageWithUrl:@"http://video.rednet.cn/uploadfile/2015/0311/20150311111749232.jpg"];
    
    
    [self.imageView2 setimageWithUrl:@"http://video.rednet.cn/uploadfile/2015/0311/20150311111749232.jpg" placeHolderImage:nil];
    
}

总结:

SDWebImage原理

相关文章

网友评论

      本文标题:iOS SDWebImgae Cache原理

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