测试已测试 | ✗ |
语言语言 | SwiftSwift |
许可 | MIT |
发布最新发布 | 2017年2月 |
SwiftSwift 版本 | 3.0 |
SPM支持 SPM | ✗ |
由 Mike Sanderson 维护。
MoyaSand 是一个针对用 Swift 编写的网络抽象层 Moya 的扩展。该扩展允许对网络层进行完全封装处理。
注意:MoyaSand 不提供 JSON 解析的方法。MoyaSand 的目标是通过对解析进行封装,将其从调用位置移开。目前,此扩展不适用于使用 ReactiveSwift 和 RxCocoa。
包含了两种技术
TargetTypeWithParser
是一个协议,供目标采用,并为 MoyaProvider 提供包装器。它允许目标指定解析方法。MoyaProvider+GenericRequest
将解析逻辑移动到一个闭包参数中,但仍需要调用位置指定要使用的解析。TargetTypeWithParser
是一个具有单一属性要求的协议
var parser : (Response) throws -> Any { get }
返回的是一个函数,该函数接受一个 Response
并返回一个类型或抛出一个错误。
函数返回 Any
以跨 Swift 强类型屏障,但解析器可以且应该返回它期望的具体类型。
可以使用闭包语法创建该函数,但它也可以是另一个类或结构体中的函数。要传递签名为 (Response) throws -> [Type]
的函数,只需传递类和函数,而无需调用它的括号即可。
extension SomeTarget : TargetTypeWithParser {
var parser : (Response) throws -> Any {
return Parser.singleString
}
}
struct Parser {
func singleString(response: Response) throws -> String {
guard let string = String(data: data, encoding: .utf8) else {
throw MoyaError.stringMapping(response)
}
return string
}
}
为了保持类型安全,必须对 MoyaProvider
进行包装。这是通过为可以返回的类型创建一个 MoyaProviderTyped
来实现的。这可以通过一个扩展来完成,该扩展按需要创建包装器,并为每个类型提供一行函数。
extension MoyaProvider where Target : TargetTypeWithParser {
var typeNSArray : MoyaProviderTyped<NSArray, Target> {
return MoyaProviderTyped.create(with: self)
}
var typeModel : MoyaProviderTyped<Model, Target> {
return MoyaProviderTyped.create(with: self)
}
}
然后在使用提供者时调用整个结构
GitHubProvider.typeNSArray.request(.aTarget) { (result) in
switch result {
case let .Success(array):
//do something with array
case let .Failure(error):
//do something with error
}
}
如果提供者类型与解析器返回的作为 Any
的类型不匹配,则将抛出一个 jsonParsing 错误。
通过传递解析器闭包消除了响应处理程序中的响应处理。
此扩展向 MoyaProvider 添加了一个泛型方法,该方法接受一个将 Response
转换为 T
并将 T
传递到完成块的解析器。
request<T>(_ target: Target, parser: (Response) throws -> T, completion: (Result<T, MoyaError>) -> Void) -> Cancellable
此处需要调用站点传递正确的解析器。
request(.aTarget, parser: Parser.singleString) { (result) in
swich result {
case let .success(string):
//do something with string
case let .Failure(error):
//error including parsing.
}
}
也可以使用在闭包中定义的解析逻辑来编写。
request(aTarget, parser: { (response) in
//handle parsing here, throw if error
} completion { (result) in
//do something with result
}
这些是添加到Moya中的,不应与现有使用发生冲突。
如果增加的封装值得,您的里程可能会有所不同。
要运行示例项目,请先克隆存储库,然后在示例目录中运行 pod install
。
示例用法基于 TargetTypeWithParser
。它基于Moya演示项目。对 TargetTypeWithParser
的符合性包含在 GitHubAPI.swift
中,并包括为 NSArray
创建 MoyaProviderTyped
。用法请参阅 ViewController
。
MoyaSand 使用 Swift 3.0。
MoyaSand 通过 CocoaPods 提供。要安装它,请将以下行添加到您的Podfile中
pod "MoyaSand"
mike-sand, [email protected]
MoyaSand 在MIT许可证下可用。有关更多信息,请参阅LICENSE文件。