Providers

使用Moya,你可以通过一个 MoyaProvider 的实例发送所有网络请求,通过枚举来指定你要访问的具体API。在配置你的 Endpoint 之后,你差不多就做好了基础配置:

let provider = MoyaProvider<MyService>()

简单配置后,你就可以使用:

provider.request(.Zen) { result in
// `result` is either .Success(response) or .Failure(error)
}

就是这样!request() 方法返回一个 Cancellable,这只有一个函数,用于取消请求。 更多关于 Result 的信息请查阅 Examples

记住,target和provider放在什么地方,完全由你自己决定。可以参考 Artsy's implementation 作为示例。

但不要忘了provider要作为属性持有,如果中途被释放的话,会出现"cancelled"` 的错误提示。

高级用法

为了解释清楚 MoyaProvider 的所有结构参数,我们将在下面一个个讲解。

endpointClosure:

MoyaProvider 初始化的第一个参数(可选)是一个endpoints闭包,它可以将你的target转换成具体的Endpoint 实例。让我们看看应该怎么写。

let endpointClosure = { (target: MyTarget) -> Endpoint<MyTarget> in
let url = target.baseURL.URLByAppendingPathComponent(target.path).absoluteString
return Endpoint(URL: url, sampleResponseClosure: {.NetworkResponse(200, target.sampleData)}, method: target.method, parameters: target.parameters)
}
let provider = MoyaProvider(endpointClosure: endpointClosure)

注:这样初始化 MoyaProvider 的时候,不需要再说明target的具体类型,Swift会根据endpointClosure 推断。

endpointClosure 就是这么简单。MoyaProvider.DefaultEndpointMapping 有默认实现。

如果需要自定义,请查看 Endpoints 文档。

requestClosure:

另一个可选的初始化参数是 requestClosure,可以将 Endpoint 转换为 NSURLRequest。同样,查看 Endpoints 文档可以获得更多信息。

stubClosure:

下一个选择是提供一个 stubClosure。它返回一个.Never (默认),或者.Immediate, 或者.Delayed(seconds), 你可以延迟这个stub模拟请求(具体n秒)。例如,.Delayed(0.2) 会把每个stub模拟请求延迟0.2s。 这在单元测试中可以很好的模拟网络延迟。

这样的好处是当你需要模拟不同于其他的特殊请求时,可以编写自己的闭包。

let provider = MoyaProvider<MyTarget>(stubClosure: { target: MyTarget -> Moya.StubBehavior in
switch target {
/* Return something different based on the target. */
}
})

但大多数时候你想对所有targets做同样的模拟测试,这里有三个 MoyaProvider 的函数可以直接调用用。

MoyaProvider.NeverStub
MoyaProvider.ImmediatelyStub
MoyaProvider.DelayedStub(seconds)

所以,如果你就是要做同样的模拟测试,可以像下面这样写:

let provider = MoyaProvider<MyTarget>(stubClosure: { (_: MyTarget) -> Moya.StubBehavior in return .Immediate })
let provider = MoyaProvider<MyTarget>(stubClosure: MoyaProvider.ImmediatelyStub)

manager:

接下来是 manager 参数。默认的,你可以通过基本设置获得一个Alamofire.Manager

public final class func DefaultAlamofireManager() -> Manager {
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.HTTPAdditionalHeaders = Alamofire.Manager.defaultHTTPHeaders let manager = Alamofire.Manager(configuration: configuration)
manager.startRequestsImmediately = false
return manager
}

有一点需要特别注意:在AF中,构造一个 Alamofire.Request 会默认立即发起请求,包括在单元测试模拟请求的时候。因此在Moya中, startRequestsImmediately 默认设为 false

如果你想自定义自己的manager,例如,加上SSL pinning,所有请求都将会通过自定义的manager发送。代码如下:

let policies: [String: ServerTrustPolicy] = [
"example.com": .PinPublicKeys(
publicKeys: ServerTrustPolicy.publicKeysInBundle(),
validateCertificateChain: true,
validateHost: true
)
] let manager = Manager(
configuration: NSURLSessionConfiguration.defaultSessionConfiguration(),
serverTrustPolicyManager: ServerTrustPolicyManager(policies: policies)
) let provider = MoyaProvider<MyTarget>(manager: manager)

plugins:

最后,你可能需要一个 plugins 数组。它们在发起请求之前和收到返回值之后回调。这儿已经有一小部分plugins:一个是network activity (NetworkActivityPlugin), 一个打印输出所有network activity (NetworkLoggerPlugin),另一个是 HTTP Authentication.

例如,你只需要将 [NetworkLoggerPlugin()] 作为参数传递给 Endpointplugins ,就可以允许log。注意:plugin也可以配置,比如 NetworkActivityPlugin 需要一个networkActivityClosure 参数。配置代码如下:

public final class NetworkActivityPlugin: PluginType {

    public typealias NetworkActivityClosure = (change: NetworkActivityChangeType) -> ()
let networkActivityClosure: NetworkActivityClosure public init(networkActivityClosure: NetworkActivityClosure) {
self.networkActivityClosure = networkActivityClosure
} // MARK: Plugin /// Called by the provider as soon as the request is about to start
public func willSendRequest(request: RequestType, target: TargetType) {
networkActivityClosure(change: .Began)
} /// Called by the provider as soon as a response arrives
public func didReceiveResponse(data: NSData?, statusCode: Int?, response: NSURLResponse?, error: ErrorType?, target: TargetType) {
networkActivityClosure(change: .Ended)
}
}

networkActivityClosure 是一个闭包,你可以在请求开始或结束时进行一些操作。和network activitiy indicator 一起很好用。

注意这个闭包的参数 (change: NetworkActivityChangeType) -> (),你只能在request .Began 或者 .Ended 的时候使用,无法提供请求的其他任何细节。

转载请注明出处http://www.cnblogs.com/liuliuliu/p/5627650.html,并注明转载。

原文链接

翻译: bibibi_liuliu

联系方式: 395985239@qq.com

Swift网络封装库Moya中文手册之Providers的更多相关文章

  1. Swift网络封装库Moya中文手册之Authentication

    Authentication 安全验证可能有点复杂,一些网络请求需要认证,这里我们讨论两种常见的. Basic HTTP Auth HTTP auth是HTTP协议自带的用户名/密码验证.如果你使用的 ...

  2. Swift网络封装库Moya中文手册之Endpoints

    Endpoints Endpoint是一种半私有的数据结构,Moya用来解释网络请求的根本构成.一个endpoint储存了以下数据: The URL. The HTTP method (GET,POS ...

  3. Swift网络封装库Moya中文手册之Plugins

    Plugins Moya plugins用于反映请求的发起或接收.Plugins定义为 PluginType 属性,可以在请求准备发起和接收到返回数据时回调. Built in plugins Moy ...

  4. Swift网络封装库Moya中文手册之RxSwift

    RxSwift Maya提供了一个可选的MoyaProvider 子类 - RxMoyaProvider.在网络请求完成时,我们不再使用 request() 函数的回调闭包,而是使用 Observab ...

  5. Swift网络封装库Moya中文手册之Targets

    Targets 使用Moya,我们首先需要定义一个target - 这通常是继承 TargetType 协议的 枚举 变量.接下来,你的app只需要处理这些targets,也就是一些你希望调用API完 ...

  6. EasyX库简单中文手册

    EasyX库简单中文手册 作者: 时间: 2021/2/2 第一个例程 #include <graphics.h> // 图像相关库 #include <conio.h> // ...

  7. Swift:网络库Alamofire

    一,Alamofire的说明与配置 1,什么是Alamofire (1)Alamofire 的前身是 AFNetworking.AFNetworking 是 iOS 和 OS X 上很受欢迎的第三方H ...

  8. swift中第三方网络请求库Alamofire的安装与使用

    swift中第三方网络请求库Alamofire的安装与使用 Alamofire是swift中一个比较流行的网络请求库:https://github.com/Alamofire/Alamofire.下面 ...

  9. Swift中文手册 -- The Basics

    原文:Swift中文手册 -- The Basics 基础部分 Swift 是 iOS 和 OS X 应用开发的一门新语言.然而,如果你有 C 或者 Objective-C 开发经验的话,你会发现 S ...

随机推荐

  1. 牌型种数|2015年蓝桥杯B组题解析第七题-fishers

    牌型种数 小明被劫持到X赌城,被迫与其他3人玩牌. 一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张. 这时,小明脑子里突然冒出一个问题: 如果不考虑花色,只考虑点数,也不考虑自己得 ...

  2. ajax post 参数说明

  3. opencv-python 学习初探2 去图片水印

    我要去除的水印是红色的.网上已经有很不错的帖子,我就不贴自己的代码了.留个指路自己以后查资料. 大概的思路就是用颜色拾取工具,拾取水印颜色,分析了图片,找到规律.比如我的图片水印是红色的,红色差不多g ...

  4. CenterOS下从零起步简单部署RockMongo

    使用Mongodb,对于调试Query,查看Collection等状态,有Rockmongo是非常方便的. 研究了下Rockmongo的部署,主要是依赖PHP环境的web服务器,当前有两种服务器,一种 ...

  5. python ros 订阅robot_pose获取机器人位置

    #!/usr/bin/env python import rospy import tf from tf.transformations import * from std_msgs.msg impo ...

  6. java日期获取前一天和后一天

    import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Calendar;import j ...

  7. windows 2012 R2安装SqlServer2016提示缺少KB2919355

    补丁的安装顺序如下: 1, 首先安装 Windows2012R2更新的先决条件KB2919442.2,按照如下顺序安装后续KB文件.顺序:clearcompressionflag.exe.KB2919 ...

  8. 查找并替换字符串 Find And Replace in String

    2018-07-29 17:08:15 问题描述: 问题求解: 字符串替换的问题有个技巧就是从右向左进行替换,这样的话,左边的index就不需要考虑变动了. public String findRep ...

  9. HTML中常见的其它标签

    HTML中常见的其它标签 一.头标签部分 1.<title>:指定浏览器的标题栏显示的内容. 2.<base>: href 属性:指定网页中所有的超链接的目录.可以是本地目录, ...

  10. LeetCode--107--二叉树的层次遍历II

    问题描述: 给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如: 给定二叉树 [3,9,20,null,null,15,7], 3 / ...