SolarNetwork 5.0.0

SolarNetwork 5.0.0

wyhazq 维护。



  • 作者:
  • wyhazq

SLNetwork

Build Status CocoaPods Compatible Carthage Compatible Platform

Swift 优雅的网络抽象层。


设计

AlamofireMoya 是优雅的 Swift 网络框架。它们各自都有其优点。当我使用它们时,我总是想结合两者的优点,使它们易于使用并保留其原始功能。因此,我写了 SolarNetwork

  • SLNetwork 对应于一个 SessionManager。
  • SLTarget 对应于一个 Host,或一组具有相同配置的请求。
  • SLRequestSLDownloadRequestSLUploadRequest 对应于数据、下载、上传请求。
  • SLProgress 在下载或上传时返回进度。
  • SLResponse 是请求的响应,您可以将其解码为 JsonObject 或 Model。
  • SLPlugin 您可以在 willSend 中修改 SLRequest,在 didReceive 中修改 SLResponse。
  • SLReflection 将 SubSLRequest 的属性反射到 Alamofire.Parameters。

因此,一个完整的请求过程是

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)

特性

  • URL/JSON/plist 参数编码
  • 上传文件/数据/流/多部分表单数据
  • 使用请求或暂停数据下载文件
  • 使用URL凭证进行身份验证
  • 使用Progress获取上传和下载进度
  • 动态调整和重试请求
  • TLS证书和公钥固定
  • 网络可达性
  • 预先填充DNS缓存
  • 完整日志记录器

要求

  • iOS 8.0+
  • Xcode 9+
  • Swift 4+

通信


安装

CocoaPods

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

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

许可证

Alamofire在MIT许可证下发布。有关详细信息,请参阅许可证