仿照SDWebImage 内部核心实现
博客专区 > JasonMs 的博客 > 博客详情
仿照SDWebImage 内部核心实现
JasonMs 发表于2年前
仿照SDWebImage 内部核心实现
  • 发表于 2年前
  • 阅读 132
  • 收藏 1
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

//
//  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
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
JasonMs
粉丝 7
博文 48
码字总数 20523
作品 1
×
JasonMs
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: