關于網絡請求,swift版本的最多的就是alamofire,是afn的swift版本,git上有詳細用法,這里就不列舉了,平時網絡請求也用不到這么大的框架,用URLSession足夠了,就自己寫了一個簡易的網絡請求
我定義了一個類似oc中block的東西,swift中叫閉包(closure)
typealias networkSuccessClosuse = (_ data:Data?, _ response:URLResponse?, _ error:Error?) -> Void
然后定義了一個枚舉值,來表示請求的類型(POST, GET等,可以自己添加,我這里只寫了這兩個)
enum netMethod:String {
case GET = "get"
case POST = "post"
}
一般的工具類,我們都會設置一個單例來作為訪問接口的唯一對象,這里我也寫了一個單例(swift的單例比較直觀)
static let netWorkManager = NetWorkTool()
private override init() {
接下來就是用URLSessino請求數據了
public func netWork(url:String, method:netMethod, paramates:[String : AnyObject]?, result:@escaping networkSuccessClosuse) {
var i = 0
var urlString = url
let session:URLSession = URLSession.shared
var request:URLRequest = URLRequest(url: URL.init(string: url)!, cachePolicy: URLRequest.CachePolicy.reloadIgnoringCacheData, timeoutInterval: 10)
request.httpMethod = method.rawValue
switch method {
case .GET:
if let para = paramates {
for (key, value) in para {
if i == 0 {
urlString += "?\(key)=\(value)"
}else {
urlString += "&\(key)=\(value)"
}
i += 1
}
}
request.url = URL.init(string: urlString)
break
case .POST:
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
do {
let para:Data = try JSONSerialization.data(withJSONObject: paramates!, options: JSONSerialization.WritingOptions.prettyPrinted)
request.httpBody = para
}catch {
}
break
default:
print("請求類型有誤")
break
}
session.dataTask(with: request, completionHandler: { (data, response, error) in
if error == nil {
result(data!, response, error)//跟oc中block存儲數據一樣
}else {
print("請求出錯")
return
}
}).resume()
}
這就是我自己寫的一個簡易的網絡請求類,用tableview展示數據的時候,你會發(fā)現,在請求數據之后,model已經加入了數組中,你也在之后寫了reloaddata,但是沒有結果,你點擊一下或者拉一下會出現結果,就像這樣寫
self?.data_ary.append(model)
self?.tb.reloadData()
導致這個結果的原因就是,URLSession是異步執(zhí)行的,異步函數實在開始執(zhí)行的時候,這個函數就返回了,但是逃逸閉包是在異步執(zhí)行完成之后,這個閉包才會返回,你這樣寫,其實跟沒寫是一樣的,tableview不會刷新數據,最簡單的方法就是,將這個刷新操作,寫在主線程里邊,像這樣
DispatchQueue.main.async {
self?.tb.reloadData()
}
這也不算是坑吧,就是習慣了oc中在請求成功的block中,執(zhí)行一下reloaddata,這里需要注意一個就好。