Swift网络封装库Moya中文手册之Providers
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()]
作为参数传递给 Endpoint
的plugins
,就可以允许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的更多相关文章
- Swift网络封装库Moya中文手册之Authentication
Authentication 安全验证可能有点复杂,一些网络请求需要认证,这里我们讨论两种常见的. Basic HTTP Auth HTTP auth是HTTP协议自带的用户名/密码验证.如果你使用的 ...
- Swift网络封装库Moya中文手册之Endpoints
Endpoints Endpoint是一种半私有的数据结构,Moya用来解释网络请求的根本构成.一个endpoint储存了以下数据: The URL. The HTTP method (GET,POS ...
- Swift网络封装库Moya中文手册之Plugins
Plugins Moya plugins用于反映请求的发起或接收.Plugins定义为 PluginType 属性,可以在请求准备发起和接收到返回数据时回调. Built in plugins Moy ...
- Swift网络封装库Moya中文手册之RxSwift
RxSwift Maya提供了一个可选的MoyaProvider 子类 - RxMoyaProvider.在网络请求完成时,我们不再使用 request() 函数的回调闭包,而是使用 Observab ...
- Swift网络封装库Moya中文手册之Targets
Targets 使用Moya,我们首先需要定义一个target - 这通常是继承 TargetType 协议的 枚举 变量.接下来,你的app只需要处理这些targets,也就是一些你希望调用API完 ...
- EasyX库简单中文手册
EasyX库简单中文手册 作者: 时间: 2021/2/2 第一个例程 #include <graphics.h> // 图像相关库 #include <conio.h> // ...
- Swift:网络库Alamofire
一,Alamofire的说明与配置 1,什么是Alamofire (1)Alamofire 的前身是 AFNetworking.AFNetworking 是 iOS 和 OS X 上很受欢迎的第三方H ...
- swift中第三方网络请求库Alamofire的安装与使用
swift中第三方网络请求库Alamofire的安装与使用 Alamofire是swift中一个比较流行的网络请求库:https://github.com/Alamofire/Alamofire.下面 ...
- Swift中文手册 -- The Basics
原文:Swift中文手册 -- The Basics 基础部分 Swift 是 iOS 和 OS X 应用开发的一门新语言.然而,如果你有 C 或者 Objective-C 开发经验的话,你会发现 S ...
随机推荐
- 论文笔记——DenseNet
<Densely Connected Convolutional Networks>阅读笔记 代码地址:https://github.com/liuzhuang13/DenseNet 首先 ...
- java 如果仅输出一位和要输出多位格式的输出问题,利用boolean值.
package com.ykmimi.testtest; /** * 第七周第二题,来自网络 */ import java.util.Scanner; public class NumberPerfe ...
- 贪心算法-Best cow line-字典序问题
代码: #include<cstdio> #include<iostream> #include<stdlib.h> #include<string> ...
- URL重写与URL路由
要介绍这两个内容,必须要从ASP.NET管线说起. ASP.NET管线 管线(Pipeline)这个词形象地说明了每个Asp.net请求的处理过程: 请求是在一个管道中,要经过一系列的过程点,这些过程 ...
- js audio 播放音乐
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Codeforces 580A - Kefa and First Steps
580A - Kefa and First Steps 思路:dp dp[i]表示包括前i个元素中a[i]在内的最大增序列. 代码: #include<bits/stdc++.h> usi ...
- CSS——图片替换方法:Fahrner图片替换法(FIR)
Html: <h1 id="fir"><span>Fahrner Image Replacement</span></h1> CSS ...
- Ant Man CodeForces - 704B (图论,贪心)
大意: 给N个点,起点S终点T,每个点有X,A,B,C,D,根据I和J的X坐标可得I到J的距离计算公式 |xi - xj| + ci + bj seconds if j< i |xi - xj| ...
- Eclipse 汉化方法
1 打开 http://www.eclipse.org/babel/downloads.php 2 复制 http://download.eclipse.org/technology/babel/u ...
- oracle11g中SQL优化(SQL TUNING)新特性之Adaptive Cursor Sharing (ACS)
1. ACS简介 Oracle Database 11g提供了Adaptive Cursor Sharing (ACS)功能,以克服以往不该共享的游标被共享的可能性.ACS使用两个新指标:sens ...