PowerfulNetworkLayer
我想向您介绍一种简单的方式来与您的 API 进行通信。这是一个轻量级的网络层,始终遵循 SOLID 原则。
结构
网络层由六个部分组成
- 环境
- 请求
- 响应
- 操作
- 调度器
- 服务
环境
描述您的 API 信息:主机 URL,缓存策略,还包括一个全局用于所有请求的头属性。
请求
描述您的网络请求。您可以创建任何想要请求:GET、POST、DELETE 等。如有需要,还可以创建下载请求。
响应
一个对象,其中包含操作描述中通过操作获得的关于您请求的数据信息。它可以是本地文件、映射对象等。
操作
一个实例,它由强类型请求和响应对象组成。它由调度器执行。
调度器
负责执行请求的调度器。默认情况下,该库有两个调度器,分别是 网络调度器
和 下载调度器
,但您可以在需要时继承 基础调度器
并编写自己的类。
服务
最后一个一个是服务。服务是一个对象,通过您提供的调度器执行您的操作。
要求
- Swift >= 3.0
- iOS >= 8.0
安装
PowerfulNetworkLayer 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中。
pod 'PowerfulNetworkLayer'
如何使用
通过CocoaPods依赖管理器安装库后,您可以在使用它的文件中编写以下命令导入此库。
import PowerfulNetworkLayer
如果您想创建自定义请求,例如,发送(POST数据)一些信息,您可以编写如下代码:
import Foundation
import Alamofire
import PowerfulNetworkLayer
final class SignUpRequest: BaseRequest<DataRequest> {
private let email: String
private let firstName: String
private let lastName: String
private let password: String
override var path: String {
return "auth/signup"
}
override var method: HTTPMethod {
return .post
}
override var encoding: ParameterEncoding {
return JSONEncoding()
}
override var parameters: Parameters {
return [
"email" : email,
"first_name" : firstName,
"last_name" : lastName,
"password" : password
]
}
init(email: String, firstName: String, lastName: String, password: String) {
self.email = email
self.firstName = firstName
self.lastName = lastName
self.password = password
}
}
您也可以创建一个响应(如有需要),代码如下所示
import Foundation
import ObjectMapper
import PowerfulNetworkLayer
final class SignUpResponse: Response, Mappable {
let user: User
let token: AccessToken
required init?(map: Map) { }
func mapping(map: Map) {
user <- map["user"]
token <- map["access_token"]
}
}
每个请求都不能没有操作。操作由请求初始化,通过承诺执行并返回响应。您可以在继承自Operation
类的execute
方法中进行重写,并在服务中保存一些需要的属性,如下所示。
import Foundation
import PromiseKit
import PowerfulNetworkLayer
final class SignUpOperation: DispatchOperation<SignUpRequest, SignUpResponse> {
override func execute<ServiceType>(
in dispatcher: Dispatcher,
by service: ServiceType
) -> Promise<SignUpResponse>
where ServiceType : AuthService {
return super.execute(in: dispatcher, by: service).tap { result in
switch result {
case .fulfilled(let response):
service.user = response.user
case .rejected(_):
break
}
}
}
}
此外,有一个示例项目,您可以在其中看到如何使用此框架。
致谢
- 由Andrew Kochulab提供
- Facebook页面
- LinkedIn页面