图片缓存

2016-03-18  本文已影响72人  CoderJackieYip

方案一:无沙盒

  1. 从缓存取图,并显示
  2. 如缓存无图,则下载
  3. 下载完后,存入缓存,并显示

方案二:有沙盒

  1. 从缓存取图,并显示
  2. 如缓存无图,从沙盒取图、显示,并存入缓存
  3. 如沙盒无图,则下载
  4. 下载完后,先存入缓存、显示,再存入沙盒

具体实现

/**
  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:临时
*/
上一篇 下一篇

猜你喜欢

热点阅读