登录 立即注册
金钱:

Code4App-iOS开发-iOS 开源代码库-iOS代码实例搜索-iOS特效示例-iOS代码例子下载-Code4App.com

查看: 337|回复: 7

Moya网络抽象层,moya

[复制链接]

187

主题

187

帖子

1014

金钱

手工艺人

发表于 2018-3-8 10:00:40 | 显示全部楼层 |阅读模式

                    

        Swift中的网络请求库Alamofire,相当于OC中的AFNetworking,在使用的过程中,我们一般都会对Alamofire做进一步的封装,可是结果大多不太理想。

        所以就引出了今天的主角Moya,它是一个网络抽象层,封装的比较充分,并且是直接调用Alamofire,借用一下Moya的图如下。

        

700.jpg

        Moya

        下面就来说一下Moya的基本使用方法。

        本文Demo的Github地址:MoyaDemo

        1、创建网络层.swift文件

        这里我创建了一个WHService.swift文件

        

        创建swift.文件

        2、定义网络请求接口

        实际上是定义一个枚举,枚举值就是每个网络请求API。

[Java] 查看源文件 复制代码
//定义请求方法
enumWHService{
casedemo1
casedemo2(name:String)
casedemo3(name:String,score:Int)
}

        3、扩展遵守协议,并实现协议方法

        这一步我们创建一个扩展,并遵守TargetType协议,这个协议中有6个方法需要实现,具体意义看下面代码中的注释

[Java] 查看源文件 复制代码
extensionWHService:TargetType{

//请求服务器的根路径
varbaseURL:URL{returnURL.init(string:"http://httpbin.org")!}

//每个API对应的具体路径
varpath:String{
switchself{
case.demo1:
return"/get"
case.demo2(name:_),.demo3(name:_,score:_):
return"/post"
}
}

//各个接口的请求方式,get或post
varmethod:Moya.Method{
switchself{
case.demo1:
return.get
case.demo2,.demo3:
return.post
}
}

//请求是否携带参数,如果需要参数,就做如demo2和demo3的设置
vartask:Task{
switchself{
case.demo1:
return.requestPlain//无参数
caselet.demo2(name)://带有参数,注意前面的let
return.requestParameters(parameters:["name":name],encoding:URLEncoding.default)
caselet.demo3(name,score)://带有参数,注意前面的let
return.requestParameters(parameters:["name":name,"score":score],encoding:URLEncoding.default)
}
}

//单元测试使用
varsampleData:Data{
switchself{
case.demo1,.demo3:
return"justfortest".utf8Encoded
case.demo2(letname):
return"{\"name\":\(name)\"}".utf8Encoded
}
}

//请求头
varheaders:[String:String]?{
return["Content-type":"application/json"]
}
}

        4. 实现网络请求(推荐第5步的做法,可以忽略本条,直接查看第5步)

        如下代码所示,首先创建一个MoyaProvider,并跟上,

        然后直接调用request方法请求数据。

        注意:request方法的参数就是上面定义的方法枚举,由此调用不同的API。达到了把网络请求封装到了WHService.swift中的需求。

[Java] 查看源文件 复制代码
letprovider=MoyaProvider()

provider.request(.demo1){(result)in
switchresult{
caselet.success(moyaResponse):
letdata=moyaResponse.data//获取到的数据
letstatusCode=moyaResponse.statusCode//请求状态:200,401,500,etc

caselet.failure(error):
print(error.localizedDescription)
}
}

        5. 创建Network结构体实现网路请求

        在WHService.swift中创建一个WHNetwork结构体,用单例创建MoyaProvider。

        这样的好处是,可以在任何需要的地方通过WHNetwork调用任意API。

[Java] 查看源文件 复制代码
//网络请求结构体
structWHNetwork{

//请求成功的回调
typealiassuccessCallback=(_result:Any)->Void
//请求失败的回调
typealiasfailureCallback=(_error:MoyaError)->Void

//单例
staticletprovider=MoyaProvider()

//发送网络请求
staticfuncrequest(
target:WHService,
success:#escapingsuccessCallback,
failure:#escapingfailureCallback
){

provider.request(target){resultin
switchresult{
caselet.success(moyaResponse):
do{
trysuccess(moyaResponse.mapJSON())//测试用JSON数据
}catch{
failure(MoyaError.jsonMapping(moyaResponse))
}
caselet.failure(error):
failure(error)
}
}
}
}

        完成了WHService.swift中的工作之后,现在我们在ViewController.swift中进行网络访问,来看一下效果。

[Java] 查看源文件 复制代码
overridefuncviewDidLoad(){
super.viewDidLoad()

WHNetwork.request(target:.demo1,success:{(result)in
whLog(result)
}){(error)in
whLog(error.localizedDescription)
}

WHNetwork.request(target:.demo2(name:"wuhao"),success:{(result)in
whLog(result)
}){(error)in
whLog(error.localizedDescription)
}

WHNetwork.request(target:.demo3(name:"wuhao",score:100),success:{(result)in
whLog(result)
}){(error)in
whLog(error.localizedDescription)
}

        显然比较简洁,并且用闭包的方式获取到需要的数据。

        后记

        本文简单介绍了Moya的使用方法,更多用法或注意事项可以到Github上学习:Moya

        本文Demo地址:MoyaDemo

        我的GitHub


               

305

主题

615

帖子

-1373

金钱

手工艺人

发表于 2018-3-8 10:00:58 | 显示全部楼层
感谢大神~

180

主题

493

帖子

1062

金钱

手工艺人

发表于 2018-3-8 10:00:59 | 显示全部楼层
支持,感谢,祝code4app越来越好~

15

主题

7145

帖子

1700

金钱

手工艺人

发表于 2018-3-8 10:01:08 | 显示全部楼层
不错不错,楼主辛苦了。。。

225

主题

518

帖子

1182

金钱

手工艺人

发表于 2018-3-8 10:01:19 | 显示全部楼层
写的真的很不错

310

主题

599

帖子

2444

金钱

手工艺人

发表于 2018-3-8 10:02:18 | 显示全部楼层
mark,收藏了

197

主题

513

帖子

1063

金钱

手工艺人

发表于 2018-3-8 10:02:30 | 显示全部楼层
不错不错,楼主辛苦了。。。
*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

关闭

每日头条

通过邮件订阅最新 Code4App 信息
上一条 /4 下一条

广告投放| Github|申请友链|手机版|Code4App ( 粤ICP备15117877号-1 )

快速回复 返回顶部 返回列表