swift自己封裝一個簡易網絡請求,逃逸閉包的一個小坑

關于網絡請求,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,這里需要注意一個就好。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 發(fā)現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 15,704評論 4 61
  • 轉載自:https://github.com/Tim9Liu9/TimLiu-iOS[https://github...
    香橙柚子閱讀 9,177評論 0 36
  • 在春天挖下的坑埋下的種子,不用等到秋天就會有故事的。于是每一天都有驚喜或者驚嚇。 突然想起去年收的葡萄番茄的種子,...
    花開無它閱讀 731評論 0 2
  • 關于什么是文化,我最最欣賞的回答,是作家梁曉聲的四句概括: 根植于內心的修養(yǎng); 無需提醒的自覺; 以約束為前提的自...
    唐祥玉閱讀 414評論 0 0
  • 好幾天沒發(fā)朋友圈了,本想順勢撤退,但是今天這個特殊又不特殊的日子又把我炸了出來。 今天是晚自習的最后一天了,這也就...
    Nasticg閱讀 276評論 0 0

友情鏈接更多精彩內容