iOS网络相关知识点
- UI事件传递和响应
UIView提供内容,负责处理触摸事件
CALayer负责显示内容contents
事件传递
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
// 实现一个按钮点击中间圆有响应,点击四个角没有响应
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
if (!self.userInteractionEnabled ||
[self isHidden] ||
self.alpha <= 0.01) {
return nil;
}
if ([self pointInside:point withEvent:event]) {
//遍历当前对象的子视图
__block UIView *hit = nil;
[self.subviews enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
// 坐标转换
CGPoint convertPoint = [self convertPoint:point toView:obj];
//调用子视图的hittest方法
hit = [obj hitTest:convertPoint withEvent:event];
// 如果找到了接受事件的对象,则停止遍历
if (hit) {
*stop = YES;
}
}];
if (hit) {
return hit;
}
else{
return self;
}
}
else{
return nil;
}
}
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
CGFloat x1 = point.x;
CGFloat y1 = point.y;
CGFloat x2 = self.frame.size.width / 2;
CGFloat y2 = self.frame.size.height / 2;
double dis = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
// 67.923
if (dis <= self.frame.size.width / 2) {
return YES;
}
else{
return NO;
}
}
事件传递的流程:
视图响应链:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {}
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {}
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {}
当子视图处理之后,就不会传递到父视图中,否则会一直往上传递,直到有视图处理,若到UIApplicationDelegate时仍没有处理,就会忽略这次的触摸事件
- 图像显示原理
优化方案:
CPU:
1、对象创建、调整、销毁
2、预排版(布局计算、文本计算)
3、预渲染(文本等异步绘制,图片编解码等)
GPU: 纹理渲染、视图混合
异步绘制:
原理:
[layer.delegate displayLayer]在这个方法中创建线程生成需要的bitmap,然后设置给layer.contents
当前屏幕渲染:在GPU的渲染操作下在当前用于显示的屏幕缓冲区中进行
离屏渲染:GPU在当前屏幕缓冲区外新开辟一个缓冲区进行渲染操作
触发离屏渲染:
1、圆角(当和maskToBounds一起使用时)
2、图层蒙版
3、阴影
4、光栅化
- 网络
HTTP协议、HTTPS与网络安全、TCP/UDP、DNS解析、Session/Cookie
HTTP是什么?
超文本传输协议。请求/响应报文?连接建立流程?HTTP的特点?
HTTP的请求方式都有哪些?
GET、POST、HEAD、PUT、DELETE、OPTIONS
GET和POST方式的区别?
GET请求参数以?分割拼接到URL后面,POST请求参数在Body里面
GET参数长度限制2048个字符,POST一般没有限制
GET请求不安全,POST请求比较安全
GET:获取资源
安全的、幂等的、可缓存的
POST:处理资源
非安全的、非幂等的、不可缓存的
安全性:不应该引起Server端的任何状态(GET、HEAD、OPTIONS)
幂等性:同一个请求方法执行多次和执行一次的效果完全相同(PUT、DELETE)
可缓存性:请求是否可以被缓存
HTTP的三次握手连接
HTTP的特点
无连接:HTTP的持久连接(头部字段 Connection:keep-alive、time: 20、max: 10)
无状态:Cookie/Session
怎么样判断一个请求是否结束?
Content-length: 1024
chunked,最后会有一个空的chunked
HTTPS和HTTP有怎样的区别?
HTTPS = HTTP + SSL/TLS
HTTPS连接建立流程是怎么样的?
会话秘钥 = random S + random C + 预主秘钥
HTTPS都使用了哪些加密手段?为什么?
1、连接建立过程使用非对称加密,非对称加密很耗时
2、后续通信过程使用对称加密
传输层协议
TCP,传输控制协议
UDP, 用户数据报协议
UDP(用户数据报协议)
特点:无连接、尽最大努力交付、面向报文
TCP与UDP区别
TCP:传输控制协议,这是一个全双工、面向连接、可靠的并且是精确控制的协议。主要用于哪些实时性不强、要求不能出错的应用。
UDP:用户数据报协议,这是一个不可靠传输协议,它不排序发送的数据段、不关心这些数据端到达的目的顺序。用在哪些实时性强、允许出错的场合。
面向报文:既不合并,也不拆分。
功能: 复用、分用、差错检测
TCP(传输控制协议)
特点:面向连接、可靠传输、面向字节流、流量控制、拥塞控制
面向连接
数据传输开始之前,需要建立连接 - 三次握手
数据传输结束之后,需要释放连接 - 四次握手
可靠传输:无差错、不丢失、不重复、按序到达
停止等待协议:无差错情况、超时传输、确认丢失、确认迟到
了解DNS解析吗?
域名到IP地址的映射,DNS解析请求采用UDP数据报,且明文
DNS解析查询方式?
递归查询、迭代查询
递归查询
迭代查询
DNS解析存在哪些常见的问题?
DNS劫持问题
DNS解析转发问题
DNS劫持与HTTP的关系是怎么样的?
DNS劫持是发生在HTTP请求之前的,DNS解析请求使用UDP数据报,端口号是53,所以没有关系
怎么样解决DNS劫持?
httpDNS、长连接
httpDNS
使用DNS协议向DNS服务器的53端口进行请求 -> 使用HTTP协议向DNS服务器的80端口进行请求
Session/Cookie
HTTP协议无状态特点的补偿
Cookie主要用来记录用户状态,区分用户;状态保存在客户端
客户端发送的cookie在http请求报文的Cookie首部字段中
服务器设置http响应报文的Set-Cookie首部字段
怎么样修改Cookie?
新cookie覆盖旧cookie
覆盖规则:name、path、domain等需要与原cookie一致
怎么样保证Cookie的安全?
对cookie进行加密处理
只在https上携带cookie
设置cookie为httpOnly,防止跨站脚本攻击
Session
Session也是用来记录用户状态,区分用户的;状态存放在服务端
session需要依赖与cookie机制
[外链图片转存失败(img-iee1Kfsy-1564146216125)(media/15392215216050/15399150888444.jpg)]
- 第三方库
AFNetworking
AFURLSessionManager
1、创建和管理NSAURLSession、NSURLSessionTask
2、实现NSURLSessionDelegate等协议的代理方法
3、引入AFSecurityPolicy保证请求安全
4、引入AFNetworkReachabilityManager监控网络状态
AsyncDisplayKit
解决的问题:
1、文本宽高计算、视图布局计算
2、文本渲染、图片渲染、图形绘制
3、对象创建、对象调整、对象销毁
基本原理 :
1、针对ASNode的修改和提交,会对其进行封装并提交到一个全局容器中
2、ASDK也在RunLoop中注册了一个Observe
3、当RunLoop进入休眠前,ASDK执行该loop内提交的所有任务
- 图片缓存框架设计
图片通过上面方式进行读写,过程是怎么样的?
以图片URL的单向Hash值作为Key
内存的设计上需要考虑哪些问题?
存储的size
淘汰策略(以队列先进先出的方式淘汰、LRU算法,比如20分钟之内是否使用过)
磁盘设计需要考虑哪些问题?
存储方式、大小限制(100M)、淘汰策略(如某一图片存储时间距今超过7天)
网络设计需要考虑的问题?
图片请求最大并发量、请求超时策略、请求优先级
对于不同格式的图片,解码采用什么方式来做?
应用策略模式对不同图片格式解码
在哪个阶段做图片解码处理?
磁盘读取后、网络请求返回后
怎么设计一个时长统计框架?
记录器(页面式、流式、自定义式)
记录的数据会由于某种原因丢失,你是怎么样处理的?
定时写磁盘
限定内存缓存调数,超过该条数,即写磁盘
关于延时上传的具体场景有哪些
前后台切换、从无网到有网的变化、通用轻量接口捎带
客户端整体架构?业务之间的解耦通信方式?
OpenURL、依赖注入