檢測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.pswp.cn/news/459062.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/459062.shtml
英文地址,請注明出處:http://en.pswp.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格式的接口…