Swift-Moya与高阶函数

449 阅读2分钟

1、Moya的意义

  • 我们日常都会和网络打交道不管是使用 AFN 还是 Alamofire ,这两者都封装的 URLSession,时间一长我们会发现我们的APP中到处都散落着和 AFN 、 Alamofire 相关的代码,不便于统一的管理,而且很多代码内容是重复的,于是我们就会新建一个中间层 Network layer 来统一管理我们代码中 AFN 、 Alamofire 的使用,即使三方库更新或者替换也不会改变业务逻辑

  • Moya 就是对网络业务逻辑的抽象(对Alamofire的封装),使我们只需要遵循相关协议,就可以发起网络请求,而不用关系底层细节 image.png

2、Alamofire的使用

image-2.png

3、Moya的使用

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

  • Moya 的模块可以大致分成这几类: image.png

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

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

  • 下一步就是把利用 requestClosure ,传入 endPoint ,然后生成 request,request 生成过程和 endPoint 很相似,我们一起来看一下  image-6.png

  • 生成了 Request 之后,就交给 Provider 来发起网络请求了  image-7.png

4、高阶函数

  • 高阶函数的本质也是函数,有两个特点
    • 接受函数或者是闭包作为参数 
    • 返回值是一个函数或者是闭包 

4.1、Map函数

  • Map 函数作用于 Collection 中的每一个元素,然后返回一个新的Collection image-8.png
    • map 函数作用于每一个string 并返回
    • 找到map函数源码 image.png

4.2、flatMap

  • 首先看下 flatMap 的源码 image-2.png

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

    • flatMap将二维数组压平为一维数组

4.3、compactMap

  • 当转换闭包返回可选值并且你期望得到的结果为非可选值的序列时,使用 compactMap  image-4.png

4.4、Reduce

  • 我们首先查看 Reduce 源码 image-5.png

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

    • reduce实现map image-6.png

    • reduce 找出数组中的最大值 image-7.png

    • reduce实现函数逆序 image-8.png