开源
SolarNetwork:基于Swift的网络框架
来源:元经纪     阅读:895
网站管理员
发布于 2023-04-07 08:21
查看主页

概述

Alamofire和Moya是Swift 中优雅的网络抽象层。他们各有各的优势。当我使用它们的时候,我们要结合两者的优点,让它们易于使用,同时保留它们原有的特性。所以我写了SolarNetwork。

所以一个完整的请求流程是:

[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)

特征

  • URL / JSON / plist 参数编码
  • 上传文件/数据/流/MultipartFormData
  • 使用请求或恢复数据下载文件
  • 使用 URLCredential 进行身份验证
  • 上传和下载 Progress Closures with Progress
  • 动态调整和重试请求
  • TLS 证书和公钥固定
  • 网络可达性
  • 预填充 DNS 缓存
  • 完整记录器

要求

  • iOS 8.0+
  • Xcode 9+
  • 斯威夫特 4+

沟通

  • 如果您想问一般性问题,请使用Stack Overflow
  • 如果您发现错误,请打开一个问题。
  • 如果您有功能请求,请打开一个问题。
  • 如果您想做出贡献,请提交拉取请求。

安装

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

[/hidecontent]

 
免责声明:本文为用户发表,不代表网站立场,仅供参考,不构成引导等用途。 开源
中国美院建校九十七周年 《黑神话:悟空》艺术展亮相西湖边
领克06em-p“黑白配”上线,在京东开启2000元抢订
儿童智能手表应回归功能本位
SK:可将 AI 大型语言模型 (LLM) 与传统编程语言集成
白宫无保证 平台19号只能关!美国针对TikTok与华为的是一批人

首页

分类

定制方案

消息

我的