Swift网络请求(Moya篇)
在使用Alamofire进行网络请求的时候,相信大部分的同学都会封装一个抽象的NetworkLayer,如”APIManager” 或者 “NetworkModel”等等。但是位置业务功能增加,会渐渐混合各种请求,不够清晰,而Moya能很好地解决这类问题。Moya在Alamofire基础上进行封装,是一个允许高度自定义的网络层,可以根据具体的需求进行接口的设置。具体的介绍可以参考Moya的官方链接,结构图如下:
接下来就介绍一下Moya的一些常见的用法:
(一)根据业务需求创建具体请求:
打比方现在我们需要书写账户的相关接口,如Login、userInfo。那么首先我们得创建AccountService:
1 | enum AccountService { |
然后让AccountService实现TargetType协议,定义请求需要的基本信息:
1 | extension AccountService: TargetType { |
如上我们就已经完成了网络请求所需要的一个endpoint
。接着通过Moya提供一个发送请求的Provider就完成了基本的使用:
1 | let provider = MoyaProvider<AccountService>() |
1 | switch result { |
1 |
(二)通过HTTPHeader设置公共请求参数
在实际开发中我们可能会需要在请求头内添加一些公共请求参数,如用于识别一些平台标志、辨别接口的版本号。你可以定义一个Endpoint的闭包,
1 | let publicParamEndpointClosure = { (target: AccountService) -> Endpoint<AccountService> in |
然后在创建请求的Provider把它添加上去,
1 | let provider = MoyaProvider(endpointClosure: publicParamEndpointClosure) |
(三)通过插件的方式监听网络状态
通常我们会在进行网络请求的时候进行一些状态展示,如loading,那么你可以通过插件的方式来实现。Moya默认有4个插件:
- AccessTokenPlugin 管理AccessToken的插件
- CredentialsPlugin 管理认证的插件
- NetworkActivityPlugin 管理网络状态的插件
- NetworkLoggerPlugin 管理网络log的插件
在这里就演示一下NetworkActivityPlugin的使用:
1 | let networkPlugin = NetworkActivityPlugin { (type) in |
同样在创建请求的Provider把它添加上去即可
1 | let provider = MoyaProvider<AccountService>(plugins: [networkPlugin]) |
当然你也可以自定义一些功能的插件,只需要实现PluginType协议,具体功能实现可参考Moya默认的插件:
1 | final class CustomPlugin: PluginType { |
(四)设置接口的超时时间
一般网络的请求需要根据具体的业务接口设置合适的超时时间,你可以参照一下方法进行设置,
1 | let requestTimeoutClosure = { (endpoint: Endpoint<AccountService>, done: @escaping MoyaProvider<AccountService>.RequestResultClosure) in |
同样在创建请求的Provider把它添加上去即可
1 | let provider = MoyaProvider<AccountService>(requestClosure: requestTimeoutClosure) |
资料参考: