对于一个项目,肯定会涉及到数据、模型 和 加载视图了
1、对于网络请求我使用的是Alamofire
。
2、对于Alamofire
我是使用Moya
(它是基于Alamofire的更高层网络请求封装抽象层)。
3、对于Moya
我使用的是RxSwift
扩展所以我导入的是pod 'Moya/RxSwift'
。
4、我这次选用了NVActivityIndicatorView
作为加载动画的视图。
5、Model我选用的SwiftyJSON
保证数据的安全,不会让APP因数据错误而crash。
说实话那些说简单的,都是会了的!!!
日了狗了哟!
我TM一定要弄一个适合我的,看了好多都不怎么适合我现在的需求 继续看文档吧。。。。
2019年04月12日
在今天我终于是把这个完成了,我的Moya
使用,我反复的去读文档,写了一个比较简单的网络请求,在慢慢改进吧。下面我们讲讲我的心得吧。
更具自己的习惯,新建一个.swift
文件,里面内容如下:
import Foundation
import UIKit
import Moya
let loginProvider = MoyaProvider<LoginService>()
enum LoginService {
case login(params: [String:Any])
case ganHuo
}
extension LoginService: TargetType {
var baseURL: URL {
switch self {
case .login:
return URL(string: "http://192.168.2.110:9090/cloudApp/")!
case .ganHuo:
return URL(string: "http://gank.io/api/today")!
}
}
var path: String {
switch self {
case .login:
return "user/login"
case .ganHuo:
return ""
}
}
var method: Moya.Method {
switch self {
case .login:
return .post
case .ganHuo:
return .get
}
}
var task: Task {
switch self {
case .login(let params):
TSLog(params)
return .requestParameters(parameters: params, encoding: JSONEncoding.default)
case .ganHuo:
return .requestPlain
}
}
var sampleData: Data {
switch self {
case .login, .ganHuo:
return "".data(using: String.Encoding.utf8)!
}
}
var headers: [String : String]? {
return ["Content-Type":"application/json;charset=utf-8"]
}
}
这上面的东西基本不用太多的解释,都是文档上有的,有兴趣的你,相信也都看过不止一次了。
我来说说,我在学习这个框架的时候需要注意到的地方。
网络请求的实际应用中,用到
.get
的请求方式是很少的。大多都是.post
请求方式。.post
请求中,我们会传入不同的参数,在AFNetworking 我们都是传入的model、在我看来swift的model和json之间的转换用SwiftJSON还是很麻烦的。
Task
中return
返回的,是你这个请求的模式,例子中一个无惨的,一个是有参数的。参数后面的encoding
是很重要的,需要看你后台需要的是啥,框架模型中用到的是URLEncoding.default
,我开始也是用的这个,打死都不能访问服务器,后面找到问题了,参数必须是json
的模式,找到问题了,然后改JSONEncoding.default
,具体用哪个,你自己看着办吧。
对于参数我不会向文档那样写,不关你是几个参数,我们都可以用(params: [String: Any])
,我不会这样用的:
写好了,然后就是去使用了
let params = ["login": accoutTextField.text! , "password": passwordTextField.text! , "deviceType":"IOS"]
loginProvider.rx.request(.login(params: params)).subscribe { event in
TSLog(event)
switch event {
case .success(let response):
let data = response.data
let json = JSON(data)
TSLog(json)
case .error(let error):
TSLog(error)
}
}.disposed(by: disposeBag)
打印结果
🎈 -[ZSLoginVC.swift loginClick(_:) line:48] 🎈
{
"resultCode" : 0,
"result" : {
"serviceStatus" : "",
"code" : "",
"remark" : "",
"messageType" : "",
"gradeName" : "",
"test" : "",
"sex" : "",
"avatar" : "",
"username" : "",
"email" : "",
"stuId" : "",
"schId" : "",
"deviceType" : "",
"available" :,
"phone" : "",
"atTimer" : "",
"clazzId" : ""
},
"attr" : {
}
}
到这里基本的使用是可以了,但是呢,还是不够的,对于我们实际项目中,还是不够简单实用的。参数没有实例化,返回的结果也是没有实例化的。等待完善吧!
为了使用RxSwift 和 Moya 我真的不知道读了多少相关blog和多少遍文档了,只要是不够静心,不管怎么样,还是成功了。一开始的心太大了,总想一下子全部弄好,结果什么都没有弄好。