检测SDWebImage有没有缓存图片 IOS 获取网络图片大小

判断图片是否缓存
NSURL *url = [NSURL URLWithString:[model.content objectForKey:@"image"]];//请求网络地址数据的同步方法//因为这个方法在子线程(全局队列)中执行,所以不需要考虑死线程的问题SDWebImageManager *manager = [SDWebImageManager sharedManager];[manager diskImageExistsForURL:url];if ([manager diskImageExistsForURL:url]) {LOG(@"11111")self.speakImage = [[manager imageCache] imageFromDiskCacheForKey:url.absoluteString];}else{LOG(@"3333333")NSData *data = [NSData dataWithContentsOfURL:url];self.speakImage = [UIImage imageWithData:data];}

/**  
获取网络图片的Size, 先通过文件头来获取图片大小  
如果失败 会下载完整的图片Data 来计算大小 所以最好别放在主线程 
如果你有使用SDWebImage就会先看下 SDWebImage有缓存过改图片没有 
支持文件头大小的格式 png、gif、jpg  http://www.cocoachina.com/bbs/read.php?tid=165823 
*/ 
+(CGSize)downloadImageSizeWithURL:(id)imageURL;

//讨厌警告
-(id)diskImageDataBySearchingAllPathsForKey:(id)key{return nil;}
+(CGSize)downloadImageSizeWithURL:(id)imageURL
{NSURL* URL = nil;if([imageURL isKindOfClass:[NSURL class]]){URL = imageURL;}if([imageURL isKindOfClass:[NSString class]]){URL = [NSURL URLWithString:imageURL];}if(URL == nil)return CGSizeZero;NSString* absoluteString = URL.absoluteString;#ifdef dispatch_main_sync_safeif([[SDImageCache sharedImageCache] diskImageExistsWithKey:absoluteString]){UIImage* image = [[SDImageCache sharedImageCache] imageFromMemoryCacheForKey:absoluteString];if(!image){NSData* data = [[SDImageCache sharedImageCache] performSelector:@selector(diskImageDataBySearchingAllPathsForKey:) withObject:URL.absoluteString];image = [UIImage imageWithData:data];}if(!image){return image.size;}}
#endifNSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:URL];NSString* pathExtendsion = [URL.pathExtension lowercaseString];CGSize size = CGSizeZero;if([pathExtendsion isEqualToString:@"png"]){size =  [self downloadPNGImageSizeWithRequest:request];}else if([pathExtendsion isEqual:@"gif"]){size =  [self downloadGIFImageSizeWithRequest:request];}else{size = [self downloadJPGImageSizeWithRequest:request];}if(CGSizeEqualToSize(CGSizeZero, size)){NSData* data = [NSURLConnection sendSynchronousRequest:[NSURLRequest requestWithURL:URL] returningResponse:nil error:nil];UIImage* image = [UIImage imageWithData:data];if(image){
#ifdef dispatch_main_sync_safe[[SDImageCache sharedImageCache] storeImage:image recalculateFromImage:YES imageData:data forKey:URL.absoluteString toDisk:YES];
#endifsize = image.size;}}return size;
}
+(CGSize)downloadPNGImageSizeWithRequest:(NSMutableURLRequest*)request
{[request setValue:@"bytes=16-23" forHTTPHeaderField:@"Range"];NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];if(data.length == 8){int w1 = 0, w2 = 0, w3 = 0, w4 = 0;[data getBytes:&w1; range:NSMakeRange(0, 1)];[data getBytes:&w2; range:NSMakeRange(1, 1)];[data getBytes:&w3; range:NSMakeRange(2, 1)];[data getBytes:&w4; range:NSMakeRange(3, 1)];int w = (w1 << 24) + (w2 << 16) + (w3 << 8) + w4;int h1 = 0, h2 = 0, h3 = 0, h4 = 0;[data getBytes:&h1; range:NSMakeRange(4, 1)];[data getBytes:&h2; range:NSMakeRange(5, 1)];[data getBytes:&h3; range:NSMakeRange(6, 1)];[data getBytes:&h4; range:NSMakeRange(7, 1)];int h = (h1 << 24) + (h2 << 16) + (h3 << 8) + h4;return CGSizeMake(w, h);}return CGSizeZero;
}
+(CGSize)downloadGIFImageSizeWithRequest:(NSMutableURLRequest*)request
{[request setValue:@"bytes=6-9" forHTTPHeaderField:@"Range"];NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];if(data.length == 4){short w1 = 0, w2 = 0;[data getBytes:&w1; range:NSMakeRange(0, 1)];[data getBytes:&w2; range:NSMakeRange(1, 1)];short w = w1 + (w2 << 8);short h1 = 0, h2 = 0;[data getBytes:&h1; range:NSMakeRange(2, 1)];[data getBytes:&h2; range:NSMakeRange(3, 1)];short h = h1 + (h2 << 8);return CGSizeMake(w, h);}return CGSizeZero;
}
+(CGSize)downloadJPGImageSizeWithRequest:(NSMutableURLRequest*)request
{[request setValue:@"bytes=0-209" forHTTPHeaderField:@"Range"];NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];if ([data length] <= 0x58) {return CGSizeZero;}if ([data length] < 210) {// 肯定只有一个DQT字段short w1 = 0, w2 = 0;[data getBytes:&w1; range:NSMakeRange(0x60, 0x1)];[data getBytes:&w2; range:NSMakeRange(0x61, 0x1)];short w = (w1 << 8) + w2;short h1 = 0, h2 = 0;[data getBytes:&h1; range:NSMakeRange(0x5e, 0x1)];[data getBytes:&h2; range:NSMakeRange(0x5f, 0x1)];short h = (h1 << 8) + h2;return CGSizeMake(w, h);} else {short word = 0x0;[data getBytes:&word; range:NSMakeRange(0x15, 0x1)];if (word == 0xdb) {[data getBytes:&word; range:NSMakeRange(0x5a, 0x1)];if (word == 0xdb) {// 两个DQT字段short w1 = 0, w2 = 0;[data getBytes:&w1; range:NSMakeRange(0xa5, 0x1)];[data getBytes:&w2; range:NSMakeRange(0xa6, 0x1)];short w = (w1 << 8) + w2;short h1 = 0, h2 = 0;[data getBytes:&h1; range:NSMakeRange(0xa3, 0x1)];[data getBytes:&h2; range:NSMakeRange(0xa4, 0x1)];short h = (h1 << 8) + h2;return CGSizeMake(w, h);} else {// 一个DQT字段short w1 = 0, w2 = 0;[data getBytes:&w1; range:NSMakeRange(0x60, 0x1)];[data getBytes:&w2; range:NSMakeRange(0x61, 0x1)];short w = (w1 << 8) + w2;short h1 = 0, h2 = 0;[data getBytes:&h1; range:NSMakeRange(0x5e, 0x1)];[data getBytes:&h2; range:NSMakeRange(0x5f, 0x1)];short h = (h1 << 8) + h2;return CGSizeMake(w, h);}} else {return CGSizeZero;}}
}

转载于:https://www.cnblogs.com/Sucri/p/4718579.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459062.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mac 下 使用 java运行 class 文件 总是提示 “错误: 找不到或无法加载主类”的解决方法...

发现问题 切换到mac平台后&#xff0c;突然想写点程序运行在mac下&#xff0c;想到mac自带java&#xff0c;会方便好多。不过在这过程中遇到了麻烦&#xff1a; 总是提示 “错误: 找不到或无法加载主类” 工程结构 查了好久&#xff0c;终于找到原型所在&#xff0c;发现网上很…

[转]VisualStudio如何组织解决方案的目录结构

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** 解决方案与项目&#xff1a; 从VC6之后VC系列就使用解决方案&#xff08;Solution&…

java几种删除_几种删除Linux目录的方法

在Linux中有很多方法可以删除目录&#xff0c;在图形化界面可以利用文件管理器&#xff0c;或者通过终端删除。本文将介绍在文本界面使用命令删除目录。使用rmdir删除目录Rmdir命令间成“remove directory”&#xff0c;用于删除空目录的命令。例如&#xff0c;删除一个名为“M…

php公钥模数,php – 如何从公共指数和RSA模数生成DER / PEM证书?

众所周知,公钥由公共指数和模数组成.我的问题是&#xff1a;如何从公共指数和RSA模数生成DER / PEM证书&#xff1f;非常感谢你提前.解决方法:使用公共指数和模数,你可能希望做的最好的事情是得到这样的东西&#xff1a;-----BEGIN PUBLIC KEY-----MIGGAoGAfHlcdrcuOK6C02rbGR3…

C# DataTable的詳細用法

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** DataTable 是一个临时保存数据的网格虚拟表(表示内存中数据的一个表。)。DataTable是A…

【SpringMVC】SpringMVC系列6之@CookieValue 映射请求Cookie 值

6、CookieValue 映射请求Cookie 值 6.1、示例 CookieValue 可让处理方法入参绑定某个 Cookie 值&#xff0c;示例如下&#xff1a;

杭电OJ-2104_hide handkerchief超简洁代码

#include<iostream> using namespace std; int n, m;; int zz(int a, int b) {return b0 ? a: zz(b, a%b); } int main() {while (cin >> n >> m&&n ! -1 && m ! -1)cout << (nb(n, m) 1 ? "YES" : "POOR Haha"…

php 年月日 中文,转换中文日期的PHP程序

转换中文日期的PHP程序本程序将中文日期输出为2001-12-23&#xff0c;并很好解决了“十”的问题&#xff0c;如“十一”和“二十一”中“十”的处理&#xff01;稍加修改可改为函数。跟随小编去看看吧&#xff01;希望对大家有所帮助&#xff01;$str"二零○一年十二月二十…

c# Invoke和BeginInvoke

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** 转自&#xff1a;http://blog.3snews.net/html/30/34530-27563.html在多线程编程中&am…

Oracle手边常用70则脚本知识汇总

Oracle手边常用70则脚本知识汇总 作者&#xff1a;白宁超 时间&#xff1a;2016年3月4日13:58:36 摘要: 日常使用oracle数据库过程中&#xff0c;常用脚本命令莫不是用户和密码、表空间、多表联合、执行语句等常规操作。另外表的导入导出也很常用&#xff0c;这些脚步命令之前都…

php常见的面试题目

一. 基本知识点1.1 HTTP协议中几个状态码的含义:503 500 401 403 404 200 301 302。。。200 : 请求成功&#xff0c;请求的数据随之返回。301 : 永久性重定向。302 : 暂时行重定向。401 : 当前请求需要用户验证。403 : 服务器拒绝执行请求&#xff0c;即没有权限。404 : 请求失…

php表示私有变量的是,PHP 访问私有和受保护的成员变量

示例反射通常用作软件测试的一部分&#xff0c;例如在运行时创建/实例化模拟对象。这对于在任何给定时间点检查对象的状态也非常有用。这是在单元测试中使用Reflection来验证受保护的类成员是否包含期望值的示例。下面是一个非常基础的汽车课。它具有受保护的成员变量&#xff…

BZOJ2683 简单题(CDQ分治)

传送门 之前听别人说CDQ分治不难学&#xff0c;今天才知道果真如此。之前一直为自己想不到CDQ的方法二很不爽&#xff0c;今天终于是想出来了一道了&#xff0c;太弱…… cdq分治主要就是把整段区间分成两半&#xff0c;然后用左区间的值去更新右区间的答案&#xff0c;每次把…

VS2010断点设置技巧

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** 许多Visual Studio下的程序员&#xff0c;甚至一些很有经验的开发人员&#xff0c;都不…

IOS应用开发版本控制工具之Versions使用,iosversions

Versions版本控制工具破解版&#xff08;Versions.zip&#xff09;下载请见本博文附件。下载后在MAC安装完以后&#xff0c;图标是莲花状。见下图&#xff1a; 双击运行如下图&#xff1a; 点击Repository&#xff0c;连接SVN服务器Repository&#xff08;服务器端采用的是SVN服…

php form action跳转,form表单页面跳转方式提交练习

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼//form表单提交练习/*新建一个form.html网页用来书写前端HTML表单*/表单提交练习姓名:年龄:电话:地址:QQ:自我评价://以上功能可自己添加或修改/*在form.html网页的基础上新建一个foms.php网页关联之前的form.html网页并书写php测试…

VS2010调试快捷键

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** vs2010 调试快捷键 命令名 快捷键 说明 调试.应用代码更改 Alt F10 启动生…

什么是算法,什么是数据结构

尽管已经学了几年&#xff0c;对它们也可以说大致懂得。但是&#xff0c;作为非计算机专业的人员&#xff0c;还是不会比计算机专业人员懂得多。既然没有受过专门的学习训练&#xff0c;自然会有三天打鱼两天晒网的感觉&#xff0c;一天可能冒出一个念头。于是乎&#xff0c;写…

如何在多web服务器共享SESSION数据

2019独角兽企业重金招聘Python工程师标准>>> 一、问题起源 稍大一些的网站&#xff0c;通常都会有好几个服务器&#xff0c;每个服务器运行着不同功能的模块&#xff0c;使用不同的二级域名&#xff0c;而一个整体性强的网站&#xff0c;用户系统是统一的&#xff0…

grpc php 返回值过大,使用grpc实现php、java、go三方互调

grpc作为经典的rpc协议&#xff0c;虽然略重&#xff0c;但是是有学习的价值的通过下面的内容可以快速上手这个grpc框架安装命令行工具php需要这个额外的protoc、grpc_php_plugin工具把这个protobuf格式的文件生成php语言里的类go需要安装protoc-gen-go工具把protobuf格式的接口…