-
目前在iOS開發(fā)中挎峦,請求網(wǎng)絡(luò)數(shù)據(jù)香追,我們經(jīng)常會使用第三方框架,而比較出名的莫過于AFNetworking
-
不過AFNetworking是使用OC開發(fā)的框架坦胶,作者又專門針對Swift開發(fā)了另外一個框架就是Alamofire透典。
Alamofire地址: https://github.com/Alamofire/Alamofire
功能
- 鏈?zhǔn)秸埱?響應(yīng)方法
- URL / JSON / plist參數(shù)編碼
- 上傳文件/數(shù)據(jù)/流/多表單數(shù)據(jù)
- 使用請求或者斷點下載來下載文件
- 使用URL憑據(jù)進(jìn)行身份認(rèn)證
- HTTP響應(yīng)驗證
- 包含進(jìn)度的上傳和下載閉包
- cURL命令的輸出
- 動態(tài)適配和重試請求
- TLS證書和Public Key Pinning
- 網(wǎng)絡(luò)可達(dá)性
- 全面的單元和集成測試覆蓋率
組件庫
為了讓Alamofire
專注于核心網(wǎng)絡(luò)的實現(xiàn),Alamofire生態(tài)系統(tǒng)還有另外兩個庫:
-
AlamofireImage:一個圖片庫顿苇,包括圖像響應(yīng)序列化器峭咒、
UIImage
和UIImageView
的擴(kuò)展、自定義圖像濾鏡纪岁、內(nèi)存中自動清除和基于優(yōu)先級的圖像下載系統(tǒng)凑队。 - AlamofireNetworkActivityIndicator:控制iOS應(yīng)用的網(wǎng)絡(luò)活動指示器。包含可配置的延遲計時器來幫助減少閃光幔翰,并且支持不受Alamofire管理的URLSession實例漩氨。
要求的使用環(huán)境
- iOS 10.0+ / macOS 10.12+ / tvOS 10.0+ / watchOS 3.0+
- Xcode 10.1+
- Swift 4.2+
安裝方法
CocoaPods
[圖片上傳失敗...(image-8d0309-1554876987904)]
iOS版本和Alamofire
版本可以自己根據(jù)實際情況自行更改。
源文件:
[圖片上傳失敗...(image-222a41-1554876987904)]
Alamofire:定義全局的function,方便使用导匣,常用的request,upload,downlaod
SessionManager:管理與服務(wù)器通信的session,底層基于NSURLSession
MultipartFormData:上傳文件的表單
NetworkReachabilityManager:對網(wǎng)絡(luò)狀態(tài)的判斷
Notifications:發(fā)起request時的通知才菠,DidResume,DidSuspend贡定,DidCancel赋访,DidComplete
Result:服務(wù)器返回的接口,枚舉類型
Timeline:主要負(fù)責(zé)記錄整個請求過程中的時間點缓待。主要提供給我們進(jìn)行debug 的操作蚓耽,比如我們整個request的初始化用了多少時間,序列化結(jié)果用了多長時間(請求開始的時刻旋炒,首次從服務(wù)器接收到數(shù)據(jù)或者發(fā)送數(shù)據(jù)給服務(wù)器的時刻步悠,從請求開始到首次收到服務(wù)器響應(yīng)的時間間隔等)
upload:上傳文件的request
validation:拿到服務(wù)器的接口可以先進(jìn)行驗證 ,code 200
基本使用
- 參數(shù)
請求接口url
-
method :請求方式
public enum HTTPMethod: String {
case options = "OPTIONS" case get = "GET" case head = "HEAD" case post = "POST" case put = "PUT" case patch = "PATCH" case delete = "DELETE" case trace = "TRACE" case connect = "CONNECT"
}
3.encoding:參數(shù)編碼
4.headers:請求頭
[圖片上傳失敗...(image-8386c1-1554876987904)]
Alamofire默認(rèn)情況下包含五種不同的響應(yīng)handler:
// 響應(yīng) Handler - 未序列化的響應(yīng)
func response( queue: DispatchQueue?, completionHandler: @escaping (DefaultDataResponse) -> Void)
-> Self
// 響應(yīng)數(shù)據(jù) Handler - 序列化成數(shù)據(jù)類型
func responseData( queue: DispatchQueue?, completionHandler: @escaping (DataResponse<Data>) -> Void)
-> Self
// 響應(yīng)字符串 Handler - 序列化成字符串類型
func responseString( queue: DispatchQueue?, encoding: String.Encoding?, completionHandler: @escaping (DataResponse<String>) -> Void)
-> Self
// 響應(yīng) JSON Handler - 序列化成Any類型
func responseJSON( queue: DispatchQueue?, completionHandler: @escaping (DataResponse<Any>) -> Void)
-> Self
// 響應(yīng) PropertyList (plist) Handler - 序列化成Any類型
func responsePropertyList( queue: DispatchQueue?, completionHandler: @escaping (DataResponse<Any>) -> Void))
-> Self
解析JSON
[圖片上傳失敗...(image-b4ff33-1554876987904)]
NSJSONSerialzation有很大的局限性瘫镇,采用SwiftJSON庫安全鼎兽,優(yōu)雅,不用擔(dān)心數(shù)組越界,不用判斷節(jié)點铣除,拆包什么的谚咬,代碼如下
func requestData() {
//[http://www.httpbin.org](http://www.httpbin.org/) 調(diào)試接口用的網(wǎng)站。輸入?yún)?shù)作為返回
let urlString = "[http://www.httpbin.org/get](http://www.httpbin.org/get)"
let params = ["name":"Keivn","age":"18"]
Alamofire.request(urlString, method: .get, parameters: params, encoding: URLEncoding.default, headers: ["Content-type":"application/x-www-form-urlencoded"]).responseJSON { (response) in
if let v = response.result.value {
let json = JSON(v)//可以直接轉(zhuǎn)化為JSON對象尚粘,是個結(jié)構(gòu)體
debugPrint(json["args"]["name"].stringValue)
}else{
debugPrint(response.result.error ?? "")
}
}
}
SwiftJSON地址:https://github.com/SwiftyJSON/SwiftyJSON
上傳下載文件
[圖片上傳失敗...(image-844e06-1554876987903)] [圖片上傳失敗...(image-d97543-1554876987903)]
[圖片上傳失敗...(image-97959c-1554876987903)]
監(jiān)聽網(wǎng)絡(luò)
[圖片上傳失敗...(image-1b1b38-1554876987903)]
//網(wǎng)絡(luò)請求前判斷網(wǎng)絡(luò)
func resuestData() {
if networkManage?.isReachable ?? false {
}else{
//
}
}