iOS网络相关知识点

iOS开发网络与性能优化

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、依赖注入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值