仿照SDWebImage 内部核心实现

//
//  CKWebImage.h
//  UI高级2
//
//  Created by Jason_Msbaby on 15/10/12.
//  Copyright ? 2015年 张杰. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface CKWebImage : NSObject

+(instancetype)defaultLoader;

-(void)downLoader:(NSString *)path FinishHandle:(void(^)(UIImage *img))block;

@end

/**
 *  UIImageView拓展类目
 */
@interface UIImageView (CKWebImage)

-(void)ck_setImageWithURL:(NSString *)url;

-(void)ck_setImageWithURL:(NSString *)url placeholderImage:(UIImage *)hoderImage;

@end
//
//  CKWebImage.m
//  UI高级2
//
//  Created by Jason_Msbaby on 15/10/12.
//  Copyright ? 2015年 张杰. All rights reserved.
//

#import "CKWebImage.h"
#import <CommonCrypto/CommonCrypto.h>

@interface CKWebImage ()
@property(nonatomic, strong) NSMutableArray *history;// The DownLoad file History
@end

@implementation CKWebImage

static CKWebImage *handle;

+(instancetype)defaultLoader{
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        handle = [CKWebImage new];
    });
    return handle;
}

- (instancetype)init
{
    self = [super init];
    if (self) {
        self.history = [NSMutableArray array];
    }
    return self;
}

-(void)downLoader:(NSString *)path FinishHandle:(void (^)(UIImage *))block{
    if (!block || !path) {
        NSLog(@"参数有误");
        return ;
    }
    NSString *imageMD5Name = [self parseMD5:path];
    //get the cache path in the phone
    NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
    NSString *fileName = [cachePath stringByAppendingPathComponent:imageMD5Name];
    
    if ([self.history containsObject:imageMD5Name]) {
        NSData *data = [NSData dataWithContentsOfFile:fileName];
        UIImage *img = [UIImage imageWithData:data];
        block(img);
        NSLog(@"本地");
    }else{
        NSURL *url = [NSURL URLWithString:path];
        NSURLSessionDataTask *dataTask = [[NSURLSession sharedSession]dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
            if (error || !data) {
                NSLog(@"请求出错");
                return ;
            }
            //download success
            [data writeToFile:fileName atomically:YES];
            [self.history addObject:imageMD5Name];
            NSLog(@"网络");
            UIImage *img = [UIImage imageWithData:data];
//            sleep(3);
            dispatch_sync(dispatch_get_main_queue(), ^{
                block(img);
            });
        }];
        [dataTask resume];
    }
}

//parse str to md5 and return md5encoding
-(NSString*)parseMD5:(NSString *)str{
    unsigned char result[16];
    const char *sourceData = str.UTF8String;
    CC_MD5(sourceData,strlen(sourceData), result);
    NSMutableString *res = [NSMutableString string];
    for (int i = 0; i < 16; i++) {
        [res appendString:[NSString stringWithFormat:@"%x",result[i]]];
    }
    return  res;
}

@end

@implementation UIImageView (CKWebImage)

-(void)ck_setImageWithURL:(NSString *)url{
    [self ck_setImageWithURL:url placeholderImage:nil];
}

-(void)ck_setImageWithURL:(NSString *)url placeholderImage:(UIImage *)hoderImage{
    self.image = hoderImage;
    __weak UIImageView *weakImageView = self;
    [[CKWebImage defaultLoader]downLoader:url FinishHandle:^(UIImage *img) {
        weakImageView.image = img;
    }];
}

@end
时间: 2024-10-09 10:16:40

仿照SDWebImage 内部核心实现的相关文章

iOS 【Multithreading-多图下载数据展示案例(二级缓存)/模拟SDWebImage内部实现】

#import "ViewController.h" #import "WZYApp.h" @interface ViewController () // 数据模型数组 @property (nonatomic, strong) NSArray *apps; // 保存操作对象的字典 @property (nonatomic, strong) NSMutableDictionary *operations; // 内存缓存 @property (nonatomic,

浅谈Nginx服务器的内部核心架构设计

前言Nginx 是一个 免费的,开源的,高性能 的 HTTP 服务器和 反向代理,以及 IMAP / POP3 代理服务器. Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名.Nginx是一个 Web 服务器,也可以用作 反向代理,负载均衡器 和 HTTP 缓存. 很多高知名度的网站都使用 Nginx,如:Netflix,GitHub,SoundCloud,MaxCDN 等.正文 Nginx的整体架构1.1. 主进程 Nginx 启动时,会生成两种类型的 进程*,一个是

SDWebImage内部实现过程

1. 入口 setImageWithURL:placeholderImage:options: 会先把 placeholderImage 显示,然后 SDWebImageManager 根据 URL 开始处理图片.2. 进入 SDWebImageManager-downloadWithURL:delegate:options:userInfo:,交给 SDImageCache 从缓存查找图片是否已经下载 queryDiskCacheForKey:delegate:userInfo:.3. 先从内

SDWebImage之SDWebImageManager

SDWebImageManager是SDWebImage的核心类.它拥有一个SDWebImageCache和一个SDWebImageDownloader属性,分别用于图片的缓存和下载处理.虽然是核心类,但它的源码很简单,这是因为相应的功能职责进行了良好的分类.下面我们来看一下它的源码. 1.SDWebImageOptions typedef NS_OPTIONS(NSUInteger, SDWebImageOptions) { /** * By default, when a URL fail

iOS之SDWebImage的使用

第一步,下载SDWebImage,导入工程.github托管地址https://github.com/rs/SDWebImage 第二步,在需要的地方导入头文件 1 #import "UIImageView+WebCache.h" 第三步,调用sd_setImageWithURL:方法缓存图片,注意,这就是新版本的新方法,旧方法是setImageWithURL:.下面将几个方法都介绍一下. 1. sd_setImageWithURL: 1 2 //图片缓存的基本代码,就是这么简单   

SDWebImage最新使用

我之前写过一篇博客,介绍缓存处理的三种方式,其中最难,最麻烦,最占内存资源的还是图片缓存,最近做的项目有大量的图片处理,还是采用了SDWebImage来处理,但是发现之前封装好的代码报错了.研究发现,是我用了新版的SDWebImage,好多方法都变了. 现在把代码贴出来,供大家参考.尤其是新手,看完这篇博客,图片缓存so easy.最后有demo供大家下载,先学习. 第一步,下载SDWebImage,导入工程.github托管地址https://github.com/rs/SDWebImage

SDWebImage的使用

第一步,下载SDWebImage,导入工程.github托管地址https://github.com/rs/SDWebImage 第二步,在需要的地方导入头文件 1 #import "UIImageView+WebCache.h" 第三步,调用sd_setImageWithURL:方法缓存图片. 下面将几个方法都介绍一下. 1. sd_setImageWithURL: 1 2 //图片缓存的基本代码,就是这么简单     [self.image1 sd_setImageWithURL:

iOS利用SDWebImage图片下载缓存

一.我们先来了解一下SDWebImage的使用: 1.导入框架,引入头文件: #import "UIImageView+WebCache.h" 也可以直接使用CocoaPods来引入和管理 (OC 如下) platform :ios, '7.0' pod 'SDWebImage', '~>3.8' (swift)并且要确保添加了use_frameworks,iOS版本为8.0+ platform :ios, '8.0' use_frameworks! 2.图片下载并缓存方法: /

收藏的关于SDWebImage的使用

介绍缓存处理的三种方式,其中最难,最麻烦,最占内存资源的还是图片缓存. 第一步,下载SDWebImage,导入工程.github托管地址https://github.com/rs/SDWebImage 第二步,在需要的地方导入头文件 1 #import "UIImageView+WebCache.h" 第三步,调用sd_setImageWithURL:方法缓存图片,注意,这就是新版本的新方法,旧方法是setImageWithURL:.下面将几个方法都介绍一下. 1. sd_setIma