2019独角兽企业重金招聘Python工程师标准>>>

在看EGOImageLoader源码的时候首先个人感觉要先理解里面的几个概念

1.inline 开头的函数表示内联函数。作用是用函数名直接代替表达式,也就是说执行到这一行代码的时候不会去调用函数,而是直接执行函数体。同样也有一定限制,那就是函数体不能太复杂,不能有循环和开关语句。最适合就是取值,而在EGOImageLoader这个框架中就是根据URL生成一个key返回。

inline static NSString* keyForURL(NSURL* url, NSString* style) {

if(style) {

return [NSStringstringWithFormat:@"EGOImageLoader-%u-%u", [[url description] hash], [style hash]];

} else {

return [NSStringstringWithFormat:@"EGOImageLoader-%u", [[url description] hash]];

}

}

********hash的作用是返回一个全局唯一的数字

2.需要了解的是EGO用的是观察者模式来回调函数,也就是说在调用imageForURL方法的时候会根据URL创建属于这个图片的专属通知,当加载完成后会发出通知,image会在notification的userinfo里面存着,并以object的形式伴随通知发过去。

****************************************************************

使用EGOImageView,

1.创建对象

imageView = [[EGOImageViewalloc] initWithPlaceholderImage:[UIImageimageNamed:@"placeholder.png"]];

imageView.frame = CGRectMake(4.0f, 4.0f, 36.0f, 36.0f);

[self.contentViewaddSubview:imageView];

2.把URL赋给imageURL这个属性

imageView.imageURL = [NSURLURLWithString:flickrPhoto];

3.在赋给这个属性的时候会自动调用属性的set方法,- (void)setImageURL:(NSURL *)aURL ;

在这个方法里,用注释的形式写出来

if(imageURL) {

//注销两个通知

[[EGOImageLoadersharedImageLoader] removeObserver:selfforURL:imageURL];

//引用计数减一并置空

[imageURLrelease];

imageURL = nil;

}

if(!aURL) {

//设置默认图片

self.image = self.placeholderImage;

imageURL = nil;

return;

} else {

//引用计数加一并且赋给imageURL

imageURL = [aURL retain];

}

[[EGOImageLoadersharedImageLoader] removeObserver:self];

//调用loader的方法来根据URL加载图片

UIImage* anImage = [[EGOImageLoader sharedImageLoader] imageForURL:aURL shouldLoadWithObserver:self];

//如果缓存有侧会立刻返回,如果缓存没有则会先设置默认图片,当加载图片完毕的时候会以通知的方法进行回调

if(anImage) {

self.image = anImage;

// trigger the delegate callback if the image was found in the cache

if([self.delegaterespondsToSelector:@selector(imageViewLoadedImage:)]) {

[self.delegateimageViewLoadedImage:self];

}

} else {

self.image = self.placeholderImage;

}

4.通知回调imageLoaderDidLoad这个方法

- (void)imageLoaderDidLoad:(NSNotification*)notification {

if(![[[notification userInfo] objectForKey:@"imageURL"] isEqual:self.imageURL]) return;

UIImage* anImage = [[notification userInfo] objectForKey:@"image"];

self.image = anImage;

//这个方法会调用drawrect的方法

[selfsetNeedsDisplay];

if([self.delegaterespondsToSelector:@selector(imageViewLoadedImage:)]) {

[self.delegateimageViewLoadedImage:self];

}

}

5.在这个类最重要的方法就是 [[EGOImageLoader sharedImageLoader] imageForURL:aURL shouldLoadWithObserver:self];

这个方法了,第一个是传URL,第二个是传观察者的对象。通过这个方法来加载图片,成功后会调用委托方法- (void)imageLoaderDidLoad:(NSNotification*)notification ;

转载于:https://my.oschina.net/sunqichao/blog/94506

EGOImageView 解析相关推荐

  1. golang通过RSA算法生成token,go从配置文件中注入密钥文件,go从文件中读取密钥文件,go RSA算法下token生成与解析;go java token共用

    RSA算法 token生成与解析 本文演示两种方式,一种是把密钥文件放在配置文件中,一种是把密钥文件本身放入项目或者容器中. 下面两种的区别在于私钥公钥的初始化, init方法,需要哪种取哪种. 通过 ...

  2. List元素互换,List元素转换下标,Java Collections.swap()方法实例解析

    Java Collections.swap()方法解析 jdk源码: public static void swap(List<?> list, int i, int j) {// ins ...

  3. 条形码?二维码?生成、解析都在这里!

    二维码生成与解析 一.生成二维码 二.解析二维码 三.生成一维码 四.全部的代码 五.pom依赖 直接上代码: 一.生成二维码 public class demo {private static fi ...

  4. Go 学习笔记(82)— Go 第三方库之 viper(解析配置文件、热更新配置文件)

    1. viper 特点 viper 是一个完整的 Go应用程序的配置解决方案,它被设计为在应用程序中工作,并能处理所有类型的配置需求和格式.支持特性功能如下: 设置默认值 读取 JSON.TOML.Y ...

  5. Go 学习笔记(77)— Go 第三方库之 cronexpr(解析 crontab 表达式,定时任务)

    cronexpr 支持的比 Linux 自身的 crontab 更详细,可以精确到秒级别. ​ 1. 实现方式 cronexpr 表达式从前到后的顺序如下所示: 字段类型 是否为必须字段 允许的值 允 ...

  6. mybatis配置文件解析

    mybatis配置文件解析 mybatis核心配置文件`mybatis-config.xml文件. mybatis的配置文件包含了会深深影响mybatis行为的设置和属性信息. 能配置的内容: con ...

  7. 谷歌BERT预训练源码解析(二):模型构建

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_39470744/arti ...

  8. Python 标准库之 xml.etree.ElementTree xml解析

    Python 标准库之 xml.etree.ElementTree Python中有多种xml处理API,常用的有xml.dom.*模块.xml.sax.*模块.xml.parser.expat模块和 ...

  9. 谷歌BERT预训练源码解析(三):训练过程

    目录 前言 源码解析 主函数 自定义模型 遮蔽词预测 下一句预测 规范化数据集 前言 本部分介绍BERT训练过程,BERT模型训练过程是在自己的TPU上进行的,这部分我没做过研究所以不做深入探讨.BE ...

最新文章

  1. mysql 新增 删除用户和权限分配
  2. 2.1.5 编码与调制
  3. MathWorks.MATLAB.NET.Arrays.MWArray”的类型初始值设定项引发异常 解决方法
  4. 3d打印 路径规划_3D打印螺旋桨技术的应用和挑战
  5. 浅谈提升C#正则表达式效率
  6. AngularJS jQuery 共存法则
  7. [原创]软件测试工具简介及下载地址(不定时更新)
  8. Activity去Title的几种方式
  9. 10清理roaming文件夹_Win10系统的C盘哪些文件可以删除?C盘文件夹功能介绍
  10. QQ在线客服代码 网页qq咨询html代码
  11. 如何用计算机管理员权限,怎么打开管理员权限,电脑怎么用管理员权限
  12. R语言绘图的中文字体处理
  13. [BJOI2019] 排兵布阵
  14. MATLAB求复杂函数积分
  15. 利用长角牛软件ARP欺骗另外的主机
  16. 被误解的明朝——中国的文艺复兴(转)
  17. Django Swagger文档库drf-spectacular
  18. AJAX基础教程zz
  19. vb.net listview 删除选定行_VBA学习笔记59-1: listview控件
  20. Java开发——JDK环境配置

热门文章

  1. VTK:PolyData之InterpolateTerrain
  2. VTK:网格之ColoredElevationMap
  3. OpenCV视差图后过滤
  4. QT的QGraphicsView类的使用
  5. 经典C语言程序100例之九
  6. C++头文件引入的一种小问题
  7. k8s pod里访问不到外部ip_K8S中的Service的存在理由
  8. 「JupyterNotebook」Jupyter快捷键个人笔记
  9. MongoDB配置参数说明
  10. Kafka的producer案例,Kafka的consumer案例