Alamofire和Moya是Swift 中优雅的网络抽象层。他们各有各的优势。当我使用它们的时候,我们要结合两者的优点,让它们易于使用,同时保留它们原有的特性。所以我写了SolarNetwork。
willSend
和修改 SLResponse didReceive
。所以一个完整的请求流程是:
[hidecontent type="logged" desc="隐藏内容:登录后可查看"]
SLNetwork(SLTarget).request(SLRequest).willSend(SLRequest)
.progressClosure(SLProgress)
.reponseData(OriginalResponse)
.didReceive(SLResponse).decodeTo(Dictionary)
.completionClosure(SLResponse)
.decodeTo(Model: Decodable).dealWithError
在大多数情况下,您需要关注的是:
SLNetwork(SLTarget).request(SLRequest)
.progressClosure(SLProgress)
.completionClosure(SLResponse)
CocoaPods是 Cocoa 项目的依赖管理器。您可以使用以下命令安装它:
$ gem install cocoapods
需要 CocoaPods 1.1+。
要使用 CocoaPods 将 SolarNetwork 集成到您的 Xcode 项目中,请在您的Podfile
:
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
use_frameworks!
target '<Your Target Name>' do
pod 'SolarNetwork'
end
然后,运行以下命令:
$ pod install
Carthage是一个去中心化的依赖管理器,它构建你的依赖并为你提供二进制框架。
您可以使用以下命令使用Homebrew安装 Carthage:
$ brew update
$ brew install carthage
要使用 Carthage 将 Alamofire 集成到您的 Xcode 项目中,请在您的Cartfile
:
github "ThreeGayHub/SolarNetwork"
运行carthage update
如果这是您第一次在项目中使用 Carthage,您将需要完成一些额外的步骤,如Carthage 中所述。
import SolarNetwork
struct HTTPBinTarget: SLTarget {
var baseURLString: String { return "https://httpbin.org" }
}
let HTTPBinNetwork = SLNetwork(HTTPBinTarget())
import SolarNetwork
//Mark: - GET
class HTTPBinGETRequest: SLRequest {
override func loadRequest() {
super.loadRequest()
self.path = "/get"
}
}
HTTPBinNetwork.request(HTTPBinGETRequest()) { (response) in
if let dictionary = response.dataDictionary {
}
else if let error = response.error {
//show error
}
}
//Mark: - POST
class HTTPBinPOSTRequest: SLRequest {
override func loadRequest() {
super.loadRequest()
self.method = .post
self.path = "/post"
}
/**
properties will encode to parameters by Reflection
["userName": "myUserName",
"password": "myPassword",
"name" : "youName"]
*/
let userName = "myUserName"
let password = "myPassword"
var name: String?
}
let postReq = HTTPBinPOSTRequest()
postReq.name = "yourName"
HTTPBinNetwork.request(postReq) { (response) in
if let dictionary = response.dataDictionary {
}
else if let error = response.error {
//show error
}
}
import SolarNetwork
class HTTPBinDownLoadRequest: SLDownloadRequest {
override func loadRequest() {
super.loadRequest()
self.path = "/image/png"
self.isResume = true //control the download request is resume or not, default is false
}
}
HTTPBinNetwork.download(HTTPBinDownLoadRequest(), progressClosure: { (progress) in
}) { (resposne) in
}
import SolarNetwork
class HTTPBinUploadRequest: SLUploadRequest {
override func loadRequest() {
super.loadRequest()
self.path = "/post"
}
}
let uploadRequest = HTTPBinUploadRequest()
uploadRequest.data = data //data to upload
HTTPBinNetwork.upload(uploadRequest, progressClosure: { (progress) in
}) { (response) in
}
在 Swift 4 中,你可以使用 Codable。
import SolarNetwork
struct User: Decodable { //Swift 4 Codable
var id: Int
var name: String
var token: String
}
HTTPBinNetwork.request(UserRequest()) { (response) in
if let user = response.decode(to: User.self) {
}
else if let error = response.error {
//show error
}
}
[/hidecontent]