文档章节

仿照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
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源码解读(二)

今天总计一下SDWebImage核心模块之下载模块。下载模块主要包括两个类SDWebImageDownloader和SDWebImageDownloaderOperation。其中SDWebImageDownloader负责对所有下载任务的管理,SDWebImag...

智小融
07/02
0
0
十分钟搭建主流框架_简单的网络部分(OC)

本节主题(简单的网络部分) 源码地址在文章末尾 达成效果 注:本文API使用HaoService数据平台 前言 废话不说了,简单来说,移动网络很重要,下面让我们来实现一个简单的Demo:对网络数据的请...

hejunbinlan
2015/11/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

中国移动蔡谦:5G传输准备就绪

目前5G已成业界热议话题,在即将到来的万物互联时代,5G是非常关键的技术。且5G相比4G,业务场景多种多样,对5G承载网带来巨大挑战。5G传输,承载先行并不仅仅是一个口号。当前5G承载网的部署...

linux-tao
24分钟前
4
0
维护“修理权”,苹果使用专有软件工具来修复MacBook Pro和iMac Pro

根据上月发给苹果授权服务提供商的一份文件,苹果公司正在使用新的专有软件诊断工具来修复MacBook Pros和iMac Pros,如果不用专有软件工具来修复关键部件,将会导致“系统失效和修复不完整”...

linuxCool
54分钟前
2
0
cacti监控安装

cacti是用PHP实现的一个软件,它用snmp服务获取数据,然后用rrdtool存储和更新数据,并生成图表展示。比较适合用于交换机、路由器的网络监控,插件众多,可图示化显示网络状况。 cacti官方推...

hiwill
今天
4
0
shell特殊符号、cut、sort、uniq、wc、tee、tr、split命令

10月15日任务 8.10 shell特殊符号cut命令 8.11 sort_wc_uniq命令 8.12 tee_tr_split命令 8.13 shell特殊符号下 cut 命令 cut作用:截取字符串 用法如下:cat /etc/passwd |head -2 |cut -d ...

hhpuppy
今天
4
0
Springboot实现filter拦截token验证和跨域

背景 web验证授权合法的一般分为下面几种 1使用session作为验证合法用户访问的验证方式 使用自己实现的token 使用OCA标准 在使用API接口授权验证时,token是自定义的方式实现起来不需要引入其...

funnymin
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部