一. 加載圖片常見問題
1.同步加載圖片
存在問題:
通過模擬延時(shí)發(fā)現(xiàn)衔统,如果網(wǎng)速慢鹿榜,會(huì)非常卡锦爵,影響用戶體驗(yàn)
滾動(dòng)表格舱殿,會(huì)重復(fù)下載圖像,造成用戶流量的損失险掀!
- 解決方法: 異步下載圖片
2.異步加載圖片
存在問題:
下載完圖片不顯示沪袭。不顯示原因:
1.使用的是系統(tǒng)提供的 cell
2.異步方法中只設(shè)置了圖像,但是沒有設(shè)置 frame
3.圖像加載后樟氢,一旦與cell 交互冈绊,會(huì)調(diào)用 cell 的 layoutSubviews 方法,重新調(diào)整cell 的布局.
- 解決方法:使用占位圖片
新問題: 使用占位圖片異步加載圖片完成后埠啃,點(diǎn)擊圖像會(huì)變小
- 解決辦法:自定義 cell(自定義 cell 可以自己固定每一個(gè)子控件的 frame)
3.自定義cell
存在問題:
如果網(wǎng)絡(luò)圖片下載速度不一致死宣,同時(shí)用戶滾動(dòng)圖片,可能會(huì)出現(xiàn)圖片顯示"錯(cuò)行"的問題碴开。
- 解決方法: MVC
4.MVC解決錯(cuò)行問題
存在問題
如果圖像下載很慢毅该,用戶滾動(dòng)表格很快,會(huì)造成重復(fù)創(chuàng)建下載操作叹螟。
- 解決方法: 使用操作緩存池
5.緩存池的選擇
所謂緩沖池鹃骂,其實(shí)就是一個(gè)容器,能夠存放多個(gè)對象
數(shù)組:按照下標(biāo)罢绽,可以通過 indexPath 可以判斷操作是否已經(jīng)在進(jìn)行中 畏线,無法解決上拉 & 下拉刷新
NSSet -> 無序的,無法定位到緩存的操作
字典:按照key良价,可以通過下載圖像的 URL(唯一定位網(wǎng)絡(luò)資源的字符串)
- 小結(jié):選擇字典作為操作緩沖池寝殴。
6.圖片緩存池
優(yōu)點(diǎn):
不用重復(fù)下載,利用MVC刷新表格明垢,不會(huì)造成數(shù)據(jù)混亂
缺點(diǎn):
所有下載后的圖像蚣常,都會(huì)記錄在模型中
如果模型數(shù)據(jù)本身很多(2000),單純圖像就會(huì)占用很大的內(nèi)存空間 如果圖像和模型綁定的很緊痊银,不容易清理內(nèi)存
- 解決辦法: 使用圖片緩存池
7.內(nèi)存警告
如果接收到內(nèi)存警告抵蚊,程序一定要做處理
-(void)didReceiveMemoryWarning {
[superdidReceiveMemoryWarning];
// 1. 取消下載操作
[self.downloadQueuecancelAllOperations];
//2. 清空緩沖池
[self.operationCacheremoveAllObjects];
[self.imageCacheremoveAllObjects];
}
8.沙盒緩存實(shí)現(xiàn)
沙盒目錄介紹
Documents
保存由應(yīng)用程序產(chǎn)生的文件或者數(shù)據(jù),例如:涂鴉程序生成的圖片,游戲關(guān)卡記錄 ,iCloud 會(huì)自動(dòng)備份Document 中的所有文件,如果保存了從網(wǎng)絡(luò)下載的文件贞绳,在上架審批的時(shí)候谷醉,會(huì)被拒!
Tmp
臨時(shí)文件夾冈闭,保存臨時(shí)文件保存在 tmp 文件夾中的文件俱尼,系統(tǒng)會(huì)自動(dòng)回收,譬如磁盤空間緊張或者重新啟動(dòng)手機(jī)程序員不需要管 tmp 文件夾中的釋放
Caches
緩存萎攒,保存從網(wǎng)絡(luò)下載的文件遇八,后續(xù)仍然需要繼續(xù)使用,例如:網(wǎng)絡(luò)下載的離線數(shù)據(jù)耍休,圖片刃永,視頻...緩存目錄中的文件系統(tǒng)不會(huì)自動(dòng)刪除,可以做離線訪問羹应!要求程序必需提供一個(gè)完善的清除緩存目錄的"解決方案"揽碘!
Preferences
系統(tǒng)偏好,用戶偏好操作是通過 [NSUserDefaultsstandardDefaults] 來直接操作
iOS 不同版本間沙盒目錄的變化
1.iOS 7.0及以前版本 bundle 目錄和沙盒目錄是在一起的
2.iOS 8.0之后园匹,bundle 目錄和沙盒目錄是分開的
NSString+Path
@implementation NSString (Path)
- (NSString *)appendDocumentPath {
NSString*dir=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
return[dir stringByAppendingPathComponent:self.lastPathComponent];
}
-(NSString *)appendCachePath {
NSString*dir=NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;
return[dir stringByAppendingPathComponent:self.lastPathComponent];
}
-(NSString *)appendTempPath {
return[NSTemporaryDirectory() stringByAppendingPathComponent:self.lastPathComponent];
}
@end
-
沙盒緩存
將圖像保存至沙盒 // 將圖片保存到沙盒緩存中 if (data != nil) { [data writeToFile:app.icon.appendCachePath atomically:true]; }
檢查沙盒緩存
// 判斷沙盒文件是否存在
UIImage *image = [UIImage
imageWithContentsOfFile:app.icon.appendCachePath];if (image != nil) {
NSLog(@"從沙盒加載圖像 ... %@", app.name);// 將圖像添加至圖像緩存
[self.imageCache setObject:image forKey:app.icon];
cell.iconView.image = image;
return cell;}