模仿SDWebImage实现异步加载图片
异步 实现 图片 加载 模仿
2023-09-14 08:57:17 时间
模仿SDWebImage实现异步加载图片
SDWebImage想必大家都不陌生吧,要实现它的图片异步加载功能这个还是很简单的.
注意:此处我只实现了异步加载图片,并没有将文件缓存到本地的打算哦:)
源码:
UIImageView+YXImageView.h
// // UIImageView+YXImageView.h // PicDemo // Copyright (c) 2014年 Y.X. All rights reserved. #import UIKit/UIKit.h @interface UIImageView (YXImageView) - (void)setImageWithURL:(NSString *)url placeholderImage:(UIImage *)placeholder; @end
UIImageView+YXImageView.m
// // UIImageView+YXImageView.m // PicDemo // Copyright (c) 2014年 Y.X. All rights reserved. #import "UIImageView+YXImageView.h" @implementation UIImageView (YXImageView) - (void)setImageWithURL:(NSString *)url placeholderImage:(UIImage *)placeholder // 先设置placeholder self.image = placeholder; // 异步下载完了之后再加载新的图片 if (url) // 子线程下载 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; // 主线程更新 dispatch_async(dispatch_get_main_queue(), ^{ if (data) self.image = [UIImage imageWithData:data]; [self setNeedsDisplay]; @end
使用的源码:
RootViewController.m
// // RootViewController.m // PicDemo // Copyright (c) 2014年 Y.X. All rights reserved. #import "RootViewController.h" #import "UIImageView+YXImageView.h" @interface RootViewController () @implementation RootViewController - (void)viewDidLoad [super viewDidLoad]; UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds]; [self.view addSubview:imageView]; [imageView setImageWithURL:@"http://pic.cnitblog.com/avatar/572952/20140226185251.png" placeholderImage:[UIImage imageNamed:@"1.png"]]; @end
核心代码:
GCD部分就不讲解了,关键的一步是需要重绘view本身,这个涨知识了:)
除了下载图片,你还可以做其他操作呢:)
SDWebImage探究(一)SDWebImage探究(二)SDWebImage探究(三)SDWebImage探究(四)SDWebImage探究(五)SDWebImage探究(六) —— 图片类型判断深入研究SDWebImage探究(七) —— 深入研...
第三方开源的图片框架很多,这里自己去写一个的目的是通过这样一个写的过程,拓展自己对架构设计的理解,包括设计模式,线程,策略,缓存等等。另外大型的框架例如Glide,代码很完善,扩展性很高,但是阅读起来有难度,而实际上,这些框架底层实现原理都是类似的,所以通过构建一个简单框架的过程更加有助于对其原理的理解,算是为阅读复杂的第三方源码打下一个基础。
相关文章
- Redis实现异步消息队列与延时队列
- C# 异步工具类 及一点小小的重构经验
- 探秘JS的异步单线程
- JQUERY AJAX无刷新异步上传文件
- swoole_event_add实现异步
- 支持异步同步的分布式CommandBus MSMQ实现 - 支持Session传递、多实例处理
- 深入浅出: Java回调机制(异步)
- Python的Asyncore异步Socket模块及实现端口转发的例子
- 跨平台python异步回调机制实现和使用方法
- 跨平台python异步回调机制实现和使用方法
- C# 使用BackgroundWorker实现WinForm异步
- Python的Asyncore异步Socket模块及实现端口转发的例子
- 跨平台python异步回调机制实现和使用方法
- 同步与异步、阻塞与非阻塞
- Mvc下异步断点续传大文件
- SAP UI5 异步加载 metadata 的代码实现
- Atitit. Async await 优缺点 异步编程的原理and实现 java c# php
- 异步请求ajax介绍,原生ajax,$.ajax基本使用
- MVC—实现ajax+mvc异步获取数据
- cocos2dx3.2 异步载入和动态载入
- 异步无刷新上传文件而且上传文件能够带上參数
- ES transport client底层是netty实现,netty本质上是异步方式,但是netty自身可以使用sync或者await(future超时机制)来实现类似同步调用!因此,ES transport client可以同步调用也可以异步(不过底层的socket必然是异步实现)
- .NET4.0中使用4.5中的 async/await 功能实现异步
- C#多线程与异步的区别
- 异步通信技术AJAX | AJAX实现搜索联想和自动补全
- 异步通信技术AJAX | AJAX实现省市联动、AJAX跨域问题
- 【java】Spring Cloud --Spring Cloud Alibaba RocketMq 异步通信实现
- 〖Python语法进阶篇⑧〗- 异步关键字与gevent包