1.图片缓存

#import "UIImageView+WebCache.h"
#import "ImageDownloader.h"@implementation UIImageView (WebCache)- (void)setImageWithUrl:(NSString *)urlStr andPlaceHolderImage:(UIImage *)image andIsScrolling:(BOOL)isScroll
{self.image = image;//文件夹位置NSString *dirPath = [NSHomeDirectory() stringByAppendingString:@"/Library/Caches/images"];NSFileManager *fm = [NSFileManager defaultManager];//判断文件夹是否存在BOOL isDir = YES;if (![fm fileExistsAtPath:dirPath isDirectory:&isDir]) {//创建文件夹
        [fm createDirectoryAtPath:dirPath withIntermediateDirectories:YES attributes:nil error:nil];}//取得文件名称NSString *fileName = [[urlStr componentsSeparatedByString:@"/"]lastObject];//取得文件路径NSString *filePath = [dirPath stringByAppendingFormat:@"/%@",fileName];//先从本地找该图片是否存在,如果存在直接从本地加载图片,否则从网络获取if ([fm fileExistsAtPath:filePath]) {self.image = [UIImage imageWithContentsOfFile:filePath];NSLog(@"从本地加载");self.layer.borderWidth = 2;return;}//如果tableview滚动,则不去加载图片if (isScroll) {return;}//如果该url已经存在manager中,即当前url已经对应有一个下载线程在下载该图片,则不需要再次启动线程下载该图片if ([[ImageDownloaderManager sharedManager]checkImageDownloaderIsExist:urlStr]) {return;}for (ImageDownloader *downloader in [[ImageDownloaderManager sharedManager]allDownloaders]) {if (downloader.imageView == self) {NSLog(@"----取消下载之前的!");[downloader cancel];[[ImageDownloaderManager sharedManager]removeDownloaderWithUrl:downloader.urlStr];break;}}self.layer.borderWidth = 0;NSLog(@"----新的下载");//从网络获取__weak typeof(self)wSelf = self;__block typeof(filePath)wFilePath = filePath;ImageDownloader *downloader = [[ImageDownloader alloc]init];downloader.imageView = self;//以urlstr为key值保存imagedownloader
    [[ImageDownloaderManager sharedManager]addDownloader:downloader withUrl:urlStr];[downloader startDownImageWithUrl:urlStr whenSuccess:^(id responseData) {//设置自身image为网络请求返回的数据wSelf.image = [UIImage imageWithData:responseData];wSelf.layer.borderWidth = 0;//本地缓存[((NSData *)responseData) writeToFile:wFilePath atomically:YES];[[ImageDownloaderManager sharedManager]removeDownloaderWithUrl:urlStr];NSLog(@"成功:%ld",[[ImageDownloaderManager sharedManager] count]);} andFailure:^(NSString *errorDesc) {[[ImageDownloaderManager sharedManager]removeDownloaderWithUrl:urlStr];NSLog(@"失败:%ld",[[ImageDownloaderManager sharedManager] count]);}];
}@end

2.viewController实现图片懒加载

#import "ViewController.h"
#import "UIImageView+WebCache.h"@interface ViewController ()<UITableViewDataSource,UITableViewDelegate>
{UITableView *_tableView;NSMutableArray *_dataArr;
}
@end// 主界面菜单
#define MAINMENU_URL @"%@/HandheldKitchen/api/more/tblcalendaralertinfo!getHomePage.do?phonetype=2&page=1&pageRecord=30&user_id=&is_traditional=0"
//最新主机地址和端口
#define kHost_And_Port @"http://121.40.54.251:80"@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];_tableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain];_tableView.delegate = self;_tableView.dataSource = self;[self.view addSubview:_tableView];//请求网络数据dispatch_async(dispatch_get_global_queue(0, 0), ^{_dataArr = [[NSMutableArray alloc]init];NSString *urlStr = [NSString stringWithFormat:MAINMENU_URL,kHost_And_Port];//同步网络请求NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlStr]];if (data) {//解析数据NSDictionary *rootDic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];for (NSDictionary *dic in rootDic[@"data"]) {[_dataArr addObject:dic[@"imagePathLandscape"]];}//主线程刷新dispatch_async(dispatch_get_main_queue(), ^{[_tableView reloadData];});}});
}#pragma mark -TableViewDelegate
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{return _dataArr.count;
}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{static NSString *cellIde = @"Cell";UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIde];if (!cell) {cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIde];//添加imgViewUIImageView *imgView = [[UIImageView alloc]initWithFrame:CGRectMake(200, 5, 80, 80)];[cell.contentView addSubview:imgView];imgView.tag = 100;if (indexPath.row == 0) {cell.backgroundColor = [UIColor redColor];}}UIImageView *imgView = (UIImageView *)[cell.contentView viewWithTag:100];//isDecelerating是否减速中,isDragging是否被拖拽中,满足其中一个,则tableview没有静止[imgView setImageWithUrl:_dataArr[indexPath.row] andPlaceHolderImage:[UIImage imageNamed:@"1.png"] andIsScrolling:_tableView.isDecelerating || _tableView.isDragging];cell.textLabel.text = [NSString stringWithFormat:@"第%ld个",indexPath.row];return cell;
}- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{return 90;
}- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{//tableview静止,加载图片
    [self downloadScreenCellImages];
}- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{//decelerate是否即将减速,若为yes则会出发didenddecelerate方法,否则不会,所以没有减速时需要加载当前屏幕范围内的图片//不存在减速即tableview已经静止if (!decelerate) {[self downloadScreenCellImages];}
}//加载当前屏幕范围内可见cell的图片
- (void)downloadScreenCellImages
{//获取当前屏幕可见cellNSArray *cells = [_tableView visibleCells];for (UITableViewCell *cell in cells) {UIImageView *imgView = (UIImageView *)[cell.contentView viewWithTag:100];//获取cell所对应的indexpathNSIndexPath *indexPath = [_tableView indexPathForCell:cell];[imgView setImageWithUrl:_dataArr[indexPath.row] andPlaceHolderImage:[UIImage imageNamed:@"1.png"] andIsScrolling:NO];}
}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}@end

转载于:https://www.cnblogs.com/liaods/p/4805531.html

图片懒加载(仿SDWebImage)相关推荐

  1. uniapp实战项目 (仿知识星球App) - - 实现图片懒加载

    实战项目名称:仿知识星球App 技术栈:前端 => uni-app ( 后端:Node.js + Mysql + Apollo + Graphql ) 已实现功能:微信登录,创建星球,内容管理, ...

  2. Vue自定义指令及实现图片懒加载指令

    一. 速识概念:   在我们使用 Vue 的过程中,遇到了很多方便我们操作的vue内置指令,以 v-xxx 表示.比如有 v-module,v-for,v-if,v-show 等等,每个指令都能实现一 ...

  3. 前端如何实现图片懒加载(lazyload) 提高用户体验

    定义 图片懒加载又称图片延时加载.惰性加载,即在用户需要使用图片的时候加载,这样可以减少请求,节省带宽,提高页面加载速度,相对的,也能减少服务器压力. 惰性加载是程序人性化的一种体现,提高用户体验,防 ...

  4. “懒”的妙用——浅析图片懒加载技术

    1.定义 图片懒加载是一种网页优化技术.图片作为一种网络资源,在被请求时也与普通静态资源一样,将占用网络资源,而一次性将整个页面的所有图片加载完,将大大增加页面的首屏加载时间.为了解决这种问题,通过前 ...

  5. 按需加载图片(图片懒加载)

    前言 按需要加载图片,这是一个非常实用的功能,不仅可以提高网站的性能,还可以为你节省流量.对于用虚拟主机的朋友来说,如果你的网站是一个图片网站或者图片比较多的网站,那么图片懒加载功能真不能少. 原理 ...

  6. python怎么加载图片-python爬虫--图片懒加载

    图片懒加载 是一种反爬机制,图片懒加载是一种网页优化技术.图片作为一种网络资源,在被请求时也与普通静态资源一样,将占用网络资源,而一次性将整个页面的所有图片加载完,将大大增加页面的首屏加载时间.为了解 ...

  7. template与图片懒加载

    曲线救国的三种案例 第一种:underscore.js的图片懒加载 1 <script id="t2" type="text/template"> ...

  8. 小程序之图片懒加载[完美方案,你不来看看?]

    效果图 既然来了,把妹子都给你. 定义 懒加载,前端人都知道的一种性能优化方式,简单的来说,只有当图片出现在浏览器的可视区域内时,才设置图片正真的路径,让图片显示出来.这就是图片懒加载. 实现原理 监 ...

  9. Python:图片懒加载技术

    一. 案例分析:抓取站长素材http://sc.chinaz.com/中的图片数据 #!/usr/bin/env python # -*- coding:utf-8 -*- import reques ...

最新文章

  1. Java项目:电商书城平台系统设计和实现(java+springboot+mysql+spring+jsp)
  2. 小米note3无线显示电脑连接服务器,小米note3如何连接电脑 小米note3连接电脑没反应怎么办...
  3. Netty 系列一(核心组件和实例).
  4. Github 1.3万星,迅猛发展的JAX对比TensorFlow、PyTorch
  5. oracle+tns+01106,TNS-01106:Listener using listener name already been started
  6. NBear简介与使用图解
  7. 受迫阻尼 matlab 仿真,MATLAB系统仿真报告——有阻尼受迫振动系统
  8. Java初学者必知 关于Java字符串问题
  9. mysql的find in set_mysql中find_in_set()函数的使用及in()用法详解
  10. 无线扩展器怎么连接好友服务器失败怎么办,tplink无线扩展器怎么设置 tplink无线扩展器设置方法...
  11. 数据库热备之SQLServer的数据库镜像实施笔记
  12. IPQ4019 QSDK 下添加EC20链接网络,非内核添加GobiNet 驱动,ipk包方法
  13. eviews7.2pojie版-eviews7.2附使用教程
  14. 架构之美-最强卷积神经网络架构设计初想
  15. 网络电视服务器账号密码,中兴网络电视机顶盒密码是多少
  16. 正负筛选(neo正向+HSV-tk负向)原理
  17. 正式发布|《数字孪生世界白皮书(2022版)》开放下载
  18. 遇到长GC停顿、CPU满载、内存泄露、JVM崩溃等高频问题,看这里!
  19. Java的 网络编程
  20. 详解比较好的音视频通话SDK开发包的技术要点

热门文章

  1. error: command ‘/usr/local/cuda-11.6/bin/nvcc‘ failed with exit code
  2. C# 固高Jog运动
  3. python将object转换为float_object格式怎样无损转换成float64格式
  4. linux下的go富集分析,GO富集分析示例【华为云技术分享】
  5. Python解包技巧
  6. C++ strcpy的用法
  7. linux输入ll命令各个字段的含义
  8. noexcept与栈展开(stack unwinding)
  9. FBX导入错误 :ImportFBX Errors:
  10. phpstyudy端口被占用怎么办