美文网首页
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 Emulator for Windows Toolkit 二、工具使用说明 1、建立...

  • Network 使用说明

    Network 使用说明 一、准备工作 1. 相关知识 Moya RxSwift Alamofire Promis...

  • Network In Network

    论文《Network In Network》 Network In Network 1 MLP convoluti...

  • Network In Network

    1.Network In Network (paper) (0)Deep Learning-TensorFlow ...

  • network in network

  • Network In Network

    Network In Network,顾名思义,即网络中的网络,传统卷积网络都是feature map + fil...

  • Markdown语法

    一标题 使用说明:# + 空格 + 标题文字。 标题2 使用说明:## + 空格 + 标题文字。 二引用 使用说明...

  • [翻译]Network In Network

    英文原文请点这里 摘要 我们提出了一种新型的深度网络结构,称为“Network In Network”(NIN),...

  • 《Network in network》理解

    论文连接这是一篇2014年发的论文,时间比较早,不过创新点比较有意义,它对传统的CNN+FC结构的分类网络进行两方...

  • docker network 基本命令

    docker network子命令 docker network create docker network co...

网友评论

      本文标题:Network 使用说明

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