方案一:无沙盒
- 从缓存取图,并显示
- 如缓存无图,则下载
- 下载完后,存入缓存,并显示
方案二:有沙盒
- 从缓存取图,并显示
- 如缓存无图,从沙盒取图、显示,并存入缓存
- 如沙盒无图,则下载
- 下载完后,先存入缓存、显示,再存入沙盒
具体实现
/**
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 先从内存缓存中取出图片 **/
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 第二个参数YES(原子性):当文件未写完出错了,则该文件不会残留
// NO(费原子性):当文件未写完出错了,则该文件会残留在沙盒
//5.5 存到沙盒中
[data writeToFile:file atomically:YES];
}
}
/*说明:
沙盒文件结构:
1. Documents:手机连到itunes后,会自动备份到苹果服务器。注:苹果不允许下载的大文件放在这里,否则,应用将可能被拒绝通过审核。
2. Library
- Caches:存放下载的文件
- Preference:偏好设置
3. tmp:临时
*/