文档章节

仿照SDWebImage 内部核心实现

JasonMs
 JasonMs
发布于 2015/10/13 09:59
字数 333
阅读 133
收藏 1
//
//  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

JasonMs

粉丝 7
博文 49
码字总数 20597
作品 1
朝阳
程序员
私信 提问
使用SDWebImage时常遇到的问题

1. 图片文件缓存的时间有多长:1周 2. SDWebImage 的内存缓存是用什么实现的? 3. SDWebImage 的最大并发数是多少? 4. SDWebImage 支持动图吗?GIF 5. SDWebImage的最大超时时长 6. SDWebIm...

_小迷糊
05/07
0
0
sdwebimage图片加载不出来,报错 -1100,"Downloaded image has 0 pixels"

找了五六个小时原因,后来发现是图片格式不对,后台给的二进制文件是webp格式的,但是图片的后缀确是.png(这里给上传图片到服务的小伙伴点一千万个赞,感谢这个“可爱”的同事帮忙把图片后缀...

业界小白
11/13
0
0
iOS 图片加载框架SDWebImage详解

目的 在使用SDWebImage加载图片时,尤其是加载gif等大图时,SDWebImage会将图片缓存在内存中,这样是非常吃内存的,这时我们就需要在适当的时候去释放一下SDWebImage的内存缓存,才不至于造成...

FBY展菲
2017/10/31
0
0
IOS使用SDWebImage出现unsupported parameter combination警告的解决方案

IOS使用SDWebImage出现下列类似警告的解决方案 CGBitmapContextCreate: unsupported parameter combination: 16 integer bits/component; 64 bits/pixel; 3-component color space; kCGImag......

开源中国搬砖小能手
2015/04/18
0
0
SDWebImage 4.1.1 发布,iOS 图片加载框架

SDWebImage 4.1.1 已发布,SDWebImage 是非常流行的 iOS 图片加载框架,提供了一个 UIImageView 的 category 用来加载网络图片并且对网络图片的缓存进行管理,采用异步方式来下载网络图片。更...

王练
2017/10/09
512
0

没有更多内容

加载失败,请刷新页面

加载更多

学习心得《稻盛和夫经营学》的读后感2300字

学习心得《稻盛和夫经营学》的读后感2300字: 作者:张宪军;稻盛和夫信奉明朝王阳明的一句话:良知没处,万法难度。人们把它理解为管理者要有在纯正心态下要有好的做事方法,不然是很难成功...

原创小博客
24分钟前
1
0
红外接收器驱动开发

背景:使用系统的红外遥控软件没有反应,然后以为自己接线错误,反复测试,结果烧坏了一个红外接收器,信号主板没有问题。所以自己开发了一个红外接收器的python驱动。接线参见https://my.os...

mbzhong
45分钟前
2
0
ActiveMQ消息传送机制以及ACK机制详解

AcitveMQ是作为一种消息存储和分发组件,涉及到client与broker端数据交互的方方面面,它不仅要担保消息的存储安全性,还要提供额外的手段来确保消息的分发是可靠的。 一. ActiveMQ消息传送机...

watermelon11
今天
1
0
HashTable和Vector为什么逐渐被废弃

HashTable,不允许键值为null,还一个就是put方法使用sychronized方法进行线程同步,单线程无需同步,多线程可用concurren包的类型。 如编程思想里面说的作为工具类,封闭性做的不好没有一个...

noob_chr
昨天
1
0
Win10 下安装Win7双系统

很多人买了预装64位Win8/8.1的电脑后想重装(或者再安装一个)Win7系统,但是折腾半天发现以前的方法根本不奏效。这是因为预装Win8/8.1的电脑统一采用了UEFI+GPT引导模式,传统的BIOS(Legacy...

yaly
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部