Network 使用说明

Network 使用说明

一、准备工作

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和多级嵌套问题。实现非常优雅的链式编程。

PromiseKit

二、使用说明

1. 纯 Moya 方式使用

  • Api
    public static let provider: Moya.MoyaProvider
  • 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
  • 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
  • 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
  • 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
  • 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添加相应的实现。

你可能感兴趣的:(Network 使用说明)