MoyaSand 0.0.2

MoyaSand 0.0.2

测试已测试
语言语言 SwiftSwift
许可 MIT
发布最新发布2017年2月
SwiftSwift 版本3.0
SPM支持 SPM

Mike Sanderson 维护。



MoyaSand 0.0.2

  • mike-sand

MoyaSand

MoyaSand 是一个针对用 Swift 编写的网络抽象层 Moya 的扩展。该扩展允许对网络层进行完全封装处理。

注意:MoyaSand 不提供 JSON 解析的方法。MoyaSand 的目标是通过对解析进行封装,将其从调用位置移开。目前,此扩展不适用于使用 ReactiveSwift 和 RxCocoa。

包含了两种技术

  • TargetTypeWithParser 是一个协议,供目标采用,并为 MoyaProvider 提供包装器。它允许目标指定解析方法。
  • MoyaProvider+GenericRequest 将解析逻辑移动到一个闭包参数中,但仍需要调用位置指定要使用的解析。

TargetTypeWithParser

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
    }
}

MoyaProviderTyped

为了保持类型安全,必须对 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+GenericRequest

通过传递解析器闭包消除了响应处理程序中的响应处理。

此扩展向 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文件。