网络请求流程

发布时间:2024年01月11日

1.创建请求

使用NSURLRequest创建一个请求对象(request)。请求对象包含请求的URL、请求方法、请求头等信息(入参)

利用POST方法发送到url端点

· 取消请求:request设置为nil

loading动画

2.发送请求

使用NSURLSession或NSURLConnection发送请求

· 调用Request类方法xx发起网络请求

(1)创建HTTPRequest对象,看shared、init

shared做了什么:
? ?创建单例httpRequest
? ?创建线程Thread(创建并启动一个线程,关联到xx方法)
? ? ? ? ? ?@autoreleasepool [1]
? ? ? ? ? ?超时检测线程:runloop获取当前线程的运行循环对象,addPort添加端口
? ? ? ? ? ?将计时器添加到Thread的runloop中?

init做了什么:
? ?创建了一个网络请求队列httpQueue,设置最大并发数4
? ?创建了两个管理回调函数的字典
? ?创建锁lock

(2)创建一个Operation对象,httprequest执行xx方法,返回该对象

创建Operation对象,执行(创建operation)方法:
? ?获取请求头中Params的值
? ?对Operation进行一些操作和赋值
? ?将Params字段的值赋给Operation对象的body属性

根据回调函数(是否存在),创建一个包含两个回调函数的NSArray对象,并将其赋值给闭包回调的变量

将Operation对象的hash值作为键
将闭包回调对象作为值
(在请求完成时可以根据Operation对象的hash值找到相应的回调函数)

添加到xx字典中

(3)是否需要重新加载网络,重载次数,优先级的设置

(4)检查当前的 HTTP 请求是否可以使用缓存

· fetchCaching获取缓存

switch case选取缓存策略:
默认缓存策略、优先缓存策略:
? shareInstance单例,init
? ? 注册两个观察者
? ? 监听系统内存警告的通知、监听应用程序即将终止的通知
? ? 如果缓存数据存在:将缓存数据返回
? ? ? ? ? ? ? ? ?从请求队列中删除该请求
无缓存:不操作直接break

· startWith:看网络是不是慢速,网络降级;埋点

处理响应

在请求完成后,会得到一个响应对象

响应对象包含响应的状态码、响应头等信息。可以使用NSHTTPURLResponse类来处理响应

获取数据,解析数据

(1)请求后调用success,failure回调函数

· succes闭包用于在请求成功时执行一些操作,其中json参数是请求返回的JSON数据

停止loading动画
json转成model ?
打点

· failure,用于在请求失败时执行一些操作,error参数是请求返回的错误信息

停止loading动画?
弹窗:网络繁忙,请稍后再试!
打点

处理数据

对于解析后的数据,可以根据需求进行处理。比如将数据展示在UI界面上、存储到本地数据库中等。

错误处理

在网络请求过程中,可能会出现各种错误,比如网络连接失败、服务器返回错误等。需要对这些错误进行处理,以便及时通知用户或进行相应的处理。

注释

[1]@autoreleasepool?是Objective-C中的一个语法结构,用于创建一个自动释放池。自动释放池是一种内存管理机制,它允许在一定范围内创建的对象在超出该范围后自动释放。

@autoreleasepool代码块内创建的对象都会被添加到该自动释放池中。当代码块结束时,自动释放池会自动释放其中的所有对象,从而释放它们所占用的内存。

使用自动释放池可以避免内存泄漏和内存消耗过大的问题,特别是在需要创建大量临时对象的情况下,使用自动释放池可以提高应用程序的性能和稳定性。

[2]类似c语言的print("%s",str)

文章来源:https://blog.csdn.net/weixin_52259822/article/details/135505538
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。