一、准备工作
1. 相关知识
- Moya
- RxSwift
- Alamofire
- PromiseKit
2. 工程相关文件 (/Swift/SwiftNetworkEngine/*)
类名 | 说明 |
---|---|
SwiftNetworkManager | Network 类所在的文件,网络请求首先看这个类 |
MoyaTargetTypeEx | Moya.TargetType 扩展,默认实现部分协议属性 |
MoyaNetworkConfig | FLError 错误信息相关定义 |
ObservableEx | RxSwift 中对 Observable 的扩展,mapHandyJSON、mapModel 等 json 转 Model 方法 |
PrimitiveSequenceEx | RxSwift 中对 Signal 的扩展,mapHandyJSON、mapModel 等 json 转 Model 方法 |
CommonTargetTypeApi | 通用Api和Objc中DataFromKey 的实现,可以不自定义TargetType 来处理简单的网络请求 |
NetworkDemo | Demo 请求相关 |
3. 关于RxSwift
RxSwift 是 ReactiveX 组织的函数响应式编程的Swift版。
Moya 默认给 RxSwift 做了扩展,做网络请求的时候可以使用 Rx 的特性。
4. 关于PromiseKit
PromiseKit是一个非常强大的框架,支持OC和Swift,可以解决回调地狱的问题,也是就Block和Closure和多级嵌套问题。实现非常优雅的链式编程。
二、使用说明
1. 纯 Moya 方式使用
- Api
public static let provider: Moya.MoyaProvider<Moya.MultiTarget>
- Demo
Network.provider.request(MultiTarget(CommonTargetTypeApi.getRequest("homelist", nil))) { (res) in
switch res {
case .success(let response):
break
case .failure(let error):
break
}
}
2. Moya + RxSwift 基本用法
- Api
public static let provider: Moya.MoyaProvider<Moya.MultiTarget>
- Demo
Network.provider.rx.request(MultiTarget(CommonTargetTypeApi.getRequest("homelist", nil)))
.subscribe(onSuccess: { (response) in
debugPrint(response)
}, onError: { (error) in
debugPrint(error.localizedDescription)
})
.disposed(by: dispose)
在subscribe之前,可以做和RxSwift相关的 mapJSON 等操作,也可以做自定义扩展中的 mapModel 的操作
3. Network.default 使用
- Api
public func request(_ target: TargetType, successClosure: @escaping (JSON) -> Void, failureClosure: @escaping (Error) -> Void)
- Demo
Network.default.request(CommonTargetTypeApi.getRequest("homelist", nil), successClosure: { (json) in
}, failureClosure: { (error) in
})
4. Network.default + PromiseKit 使用
- Api
public func request(_ target: TargetType) -> Promise<JSON>
- Demo
Network.default.request(CommonTargetTypeApi.getRequest("homelist", nil))
.done { (json) in
}.catch { (error) in
}
在done之前,可以做Promise相关的map、compactMap相关的操作,做数据转型
5. 通用请求
- Api
public func request(_ target: TargetType) -> Promise<JSON>
- Demo
Network.default.request(CommonTargetTypeApi.getRequest("homelist", nil))
.compactMap({ (json) -> HomeMenuItem? in
return HomeMenuItem.deserialize(from: json.dictionaryObject)
})
.done { (model) in
}.catch { (error) in
}
6. DataFromKey 请求
- Api
public func request(_ target: TargetType) -> Promise<JSON>
- Demo
Network.default.request(ObjcDataFromKeyTargetApi.requestFromKey("categoryReport", nil))
.done { (json) in
debugPrint(json.description)
}.catch { (error) in
debugPrint(error.localizedDescription)
}
三、扩展说明
1. RxSwift 扩展
参见 ObservableEx 和 PrimitiveSequenceEx 类
2. PromiseKit 扩展
参见 SwiftNetworkManager 类
四、Error 与 NSError
1. WTError
enum WTError {
case mapHandyJSON
case responseCodeNot200(Int, String)
}
extension WTError: LocalizedError {
var errorDescription: String? {
switch self {
case .mapHandyJSON:
return "json 转 HandyJSON 协议对象失败"
case let .responseCodeNot200(code, errMsg):
return "接口返回失败 - Code:\(code), Error:\(errMsg)"
}
}
var failureReason: String? {
return errorDescription
}
}
extension WTError: CustomNSError {
var errorCode: Int {
switch self {
case let .responseCodeNot200(code, _):
return code
default:
return defaultErrorCode
}
}
public static var errorDomain: String {
return "com.wutiao.error"
}
}
WTError的对象可以直接获取errorCode值,也可以转成NSError获取errorCode值。 大家如果需要添加自己的Error类型,请在LocalizedError和CustomNSError添加相应的实现。
网友评论