方案一:無沙盒
- 從緩存取圖俺驶,并顯示
- 如緩存無圖,則下載
- 下載完后,存入緩存暮现,并顯示
方案二:有沙盒
- 從緩存取圖还绘,并顯示
- 如緩存無圖,從沙盒取圖栖袋、顯示拍顷,并存入緩存
- 如沙盒無圖,則下載
- 下載完后塘幅,先存入緩存昔案、顯示,再存入沙盒
具體實現(xiàn)
/**
self.apps = @[app1, app2, app3, ...];
app1 = @{@"name":@"...", @"icon":@"http://p16.qhimg.com/dr/34_5/fo2489234n34k545l234.png", @"download":@"..."};
**/
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
... ...
JKYApp *app = self.apps[indexPath.row];
/**1 先從內(nèi)存緩存中取出圖片 **/
UIImage *image = self.imageCache[app.icon];
if (image) { /**2 緩存有电媳,則加載 **/
cell.imageView.image = image;
} else { /**3 緩存無踏揣,則下載 **/
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:app.icon]];
cell.imageView.image = [UIImage imageWithData:data];
/**4 存到字典中 **/
self.imageCache[app.icon] = cell.imageView.image;
/**5 存到沙盒中 **/
//5.1 獲取沙盒Library/Caches路徑
NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCacheDirectory, NSUserDomainMask, YES) firstObject];
//5.2 獲取文件名
NSString *fileName = [app.icon lastPathComponent];
//5.3 合并為文件全路徑
NSString *file = [caches stringByAppendingPathComponent:fileName];
//5.4 第二個參數(shù)YES(原子性):當(dāng)文件未寫完出錯了,則該文件不會殘留
// NO(費原子性):當(dāng)文件未寫完出錯了匾乓,則該文件會殘留在沙盒
//5.5 存到沙盒中
[data writeToFile:file atomically:YES];
}
}
/*說明:
沙盒文件結(jié)構(gòu):
1. Documents:手機連到itunes后捞稿,會自動備份到蘋果服務(wù)器。注:蘋果不允許下載的大文件放在這里拼缝,否則娱局,應(yīng)用將可能被拒絕通過審核。
2. Library
- Caches:存放下載的文件
- Preference:偏好設(shè)置
3. tmp:臨時
*/