1、Moya的意义
-
我们日常都会和网络打交道不管是使用 AFN 还是
Alamofire,这两者都封装的 URLSession,时间一长我们会发现我们的APP中到处都散落着和 AFN 、 Alamofire 相关的代码,不便于统一的管理,而且很多代码内容是重复的,于是我们就会新建一个中间层 Network layer 来统一管理我们代码中 AFN 、 Alamofire 的使用,即使三方库更新或者替换也不会改变业务逻辑 -
Moya 就是对网络业务逻辑的抽象(对Alamofire的封装),使我们只需要遵循相关协议,就可以发起网络请求,而不用关系底层细节

2、Alamofire的使用

3、Moya的使用
-
在看 Moya 是如何一步步构建出来的,我们先来看一下 Moya 如何使用首先我们新建一个 enum NBA ,当然这里面我们目前还没有那么多的逻辑分支,我们先空着,接下来使用对当前的 enum 进行 extension ,这里我们遵循协议 TargetType ,点击进入头文件可以看以下 TargetType 中定义的 都是基础的网络请求数据,代码如下

-
Moya 的模块可以大致分成这几类:

-
其次 Moya 主要的数据处理流程可以用下面这张图来表示:Moya流程图,对于这张图我们一 点点来分析,我们先来看第一个阶段

-
第一步创建了一个遵守
TargetType协议的枚举,这个过程中我们完成网络请求的基本配置;接下来通过endpointClosure的加工生成了一个endPoint,点击进入 EndPoint 的文件中,可以看到这里是对 TargetType 的一层再包装,其中 endpointCloure的代码如下

-
下一步就是把利用
requestClosure,传入 endPoint ,然后生成 request,request 生成过程和 endPoint 很相似,我们一起来看一下
-
生成了 Request 之后,就交给
Provider来发起网络请求了
4、高阶函数
- 高阶函数的本质也是函数,有两个特点
- 接受函数或者是闭包作为参数
- 返回值是一个函数或者是闭包
4.1、Map函数
- Map 函数作用于 Collection 中的每一个元素,然后返回一个新的Collection
- map 函数作用于每一个string 并返回
- 找到map函数源码

4.2、flatMap
-
首先看下 flatMap 的源码

-
flatMap 的返回值为 Sequence 类型,而Map为T 同时 flat返回一个result 会压平数组

- flatMap将二维数组压平为一维数组
4.3、compactMap
- 当转换闭包返回可选值并且你期望得到的结果为非可选值的序列时,使用 compactMap

4.4、Reduce
-
我们首先查看 Reduce 源码

-
为了更好的理解当前 reduce 的工作原理,我们来试着实现一下 map , flatMap , filter 函数
-
reduce实现map

-
reduce 找出数组中的最大值

-
reduce实现函数逆序

-