美文网首页
Network 使用说明

Network 使用说明

作者: iOS_zy | 来源:发表于2018-10-25 10:59 被阅读17次

    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<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添加相应的实现。

    相关文章

      网友评论

          本文标题:Network 使用说明

          本文链接:https://www.haomeiwen.com/subject/sreqtqtx.html