重要的3個類
#import "SDWebImageManager.h"http://在內(nèi)存警告appdelegate.m里面使用
#import "UIImageView+WebCache.h"在處理圖片的時候使用
#import " SDImageCache.h "http://可以查看緩存的時間和最大的內(nèi)存緩存
1.簡述講解的內(nèi)容
<1>什么是SDWebImage?
<2>iOS中著名的牛逼的網(wǎng)絡圖片處理框架
<3>包含的功能:圖片的下載,圖片的緩存(什么緩存都有,還可以設定多久緩存的圖片清理),下載的進度監(jiān)聽(可以處理大圖片的下載進度),gif處理(動態(tài)圖的處理播放,用ImageIO抽出來gif里面的每一幀來處理gif圖片播放)等等
<4>用法極其簡單,功能十分強大,大大提高了圖片的處理效率
<5>國內(nèi)超過90%的iOS項目都有它的影子
一個項目的地址
題外話: SDWebImage也是繼承于imageIO 專門用于處理Gif圖片
2.使用它之前先導入
導入#import "UIImageView+WebCache.h"
3.SDWebImage對各種方法的使用
1.圖片的下載展示以及無網(wǎng)路替換圖片
- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder;
要的是圖片的連接和無網(wǎng)絡的情況下替換圖片
操作的對象是 UIImageView的對象,在沒有網(wǎng)絡的情況下圖片也會顯示出來,是應為SDWebImage它會把圖片緩存一周
2.進行圖片的下載和展示(操作對象都是UIImageView)
- (void)sd_setImageWithURL:(NSURL *)url;僅僅加載圖片的連接
3.完成圖片的展示和下載后再做其他的事情 completed(圖片加載完畢)
[imageView sd_setImageWithURL:(NSURL *) placeholderImage:(UIImage *) completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
在圖片**加載完畢**這里可以做一些其他的事情(有可能從沙盒里面獲取)
}];
4.帶有下載的參數(shù),一般是前兩種參數(shù)混合使用
NSURL *url = [NSURL URLWithString:array[indexPath.row]];
UIImage *placeholder = [UIImage imageNamed:@"haha"];
//options 下載的一些參數(shù)
//SDWebImageOptions (前兩個混合使用價值比較高,其他的特殊情況下使用)
/*
1.SDWebImageRetryFailed 下載失敗再次下載
2.SDWebImageLowPriority 在UI交互情況下停止下載,UIScrollView減速時延遲下載
3.SDWebImageCacheMemoryOnly 緩存在內(nèi)存里面,下次進來就沒有了,一般不用
4.SDWebImageProgressiveDownload 圖片從上往下刷出來
5.SDWebImageRefreshCached 刷新緩存
*/
SDWebImageOptions options = SDWebImageRetryFailed | SDWebImageLowPriority;
[cell.picture sd_setImageWithURL:url placeholderImage:placeholder options:options progress:^(NSInteger receivedSize, NSInteger expectedSize) {
//這里每下載一段就會被調(diào)用(可能會頻繁的調(diào)用):具體的根據(jù)圖片的大小來計算
//receivedSize 接收到多少個字節(jié)
//expectedSize 期望的字節(jié)(總的字節(jié))
NSLog(@"下載進度==%f",1.0*receivedSize/expectedSize);//或者(double)*receivedSize/expectedSize
//這里是圖片下載的進度
} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
//圖片加載完畢(可能是從沙盒里面加載,也可能從服務器加載):只調(diào)用一次
}];
第一次會走下載進度那里,之后不再走,直接從沙盒獲取,加載完成
在第一次下載會走瞎子進度那里
5.下面我們來講解一下有關圖片在沙盒里面內(nèi)存較大的情況的下的內(nèi)存報警的處理辦法,在appdelegate.m里面進行 處理
在appdelegate里面導入#import "SDWebImageManager.h"
/*
當我們的整個程序接收到內(nèi)存警告
*/
-(void)applicationDidReceiveMemoryWarning:(UIApplication *)application
{
SDWebImageManager *manger = [SDWebImageManager sharedManager];
//1.取消下載的操作
[manger cancelAll];
//2.清楚內(nèi)存的緩存,沙盒不用清,沙盒和內(nèi)存沒關系
/*
[manger.imageCache clearDisk];//清除沙盒,東西會全部沒有了,下次還要下載
[manger.imageCache cleanDisk];//清楚沙盒過期的緩存
*/
//在此我們只需要清楚內(nèi)存呢警告就好了
[manger.imageCache clearMemory];//清除內(nèi)存警告
}
<1>圖片默認緩存的時間是 1個星期,以秒為單位
如:manger.imageCache.maxCacheAge = 100 * 60 *60;//緩存100天
默認一個星期
<2>緩存最多(最大的緩存量)可以裝多少東西,比如說我設置8M,超過之后會清理以前的東西來放新的東西,在此沒有默認緩存多大,單位是bytes字節(jié)
最大的緩存大小
簡單的運用 密碼: bj5j
最后:下面是我對cell上圖片的緩存
/**
* 1.內(nèi)存緩存圖片
*/
@property(nonatomic,strong) NSMutableDictionary *dataDictionary;
NSString *stringImage = [NSString stringWithFormat:@"%@",self.plist[indexPath.row]];
//先從內(nèi)存緩存中取出圖片
UIImage *image = self.dataDictionary[stringImage];
if (image) {//內(nèi)存有圖片
cell.imageCellPicture.image = image;
}else{// 內(nèi)存中沒有圖片
dispatch_async(dispatch_get_global_queue(0, 0), ^{
//獲取Library/Caches 文件夾
NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
//獲取文件名(也就是取得路徑的最后一個路徑)
NSString *fileName = [stringImage lastPathComponent];
//計算出全路徑
NSString *filePath = [cachesPath stringByAppendingPathComponent:fileName];
//取出圖片
NSData *data = [NSData dataWithContentsOfFile:filePath];
if(data){//直接利用沙盒中圖片
dispatch_async(dispatch_get_main_queue(), ^{
cell.imageCellPicture.image = [UIImage imageWithData:data];
});
//存到字典中
self.dataDictionary[stringImage] = cell.imageCellPicture.image;
}else
{ // 下載圖片
data = [NSData dataWithContentsOfURL:[NSURL URLWithString:stringImage]];
UIImage *image1 = [UIImage imageWithData:data];
dispatch_async(dispatch_get_main_queue(), ^{
cell.imageCellPicture.image = image1;
});
// 存到字典中
self.dataDictionary[stringImage] = cell.imageCellPicture.image;
// 將圖片文件數(shù)據(jù)寫入沙盒中
[data writeToFile:filePath atomically:YES];
}
});
圖片緩存代碼 密碼: wjhv
有沙盒的緩存
完善的圖片緩存 密碼: gr3k