Swift3.0 URLSession學(xué)習(xí)筆記

因?yàn)閕OS的權(quán)限限制椒振, 如果使用HTTP協(xié)議要配置info.plist, 將Allow Arbitary Loads設(shè)為YES泣洞。


屏幕快照 2017-01-12 下午10.18.30.png

iOS封裝了URLSession類處理HTTP交互森书, 支持交互文本、上傳文件建钥、下載文件藤韵。

一、 文本交互
一般是用POST請(qǐng)求將包體數(shù)據(jù)傳給后臺(tái)熊经, 后臺(tái)返回json包體給手機(jī)端荠察, 手機(jī)端解析json后做邏輯。

<pre> let urlStr = "http://baike.baidu.com/api/openapi/BaikeLemmaCardApi?scope=103&format=json&appid=379020&bk_key=swift&bk_length=600"
let url = URL(string: urlStr)
var request = URLRequest(url: url!) //請(qǐng)求
request.httpMethod = "POST" //修改http方法
//request.httpBody = Data(bytes: <#T##Array<UInt8>#>) //設(shè)置POST包體
let session = URLSession.shared
let date = Date()
print("創(chuàng)建任務(wù)奈搜, 時(shí)間:\(date.timeIntervalSince1970)")
//初始化請(qǐng)求
let dataTask = session.dataTask(with: request,
completionHandler: { (data, resp, err) in
let comDate = Date()
print("http返回悉盆, 時(shí)間:\(comDate.timeIntervalSince1970)")
if err != nil {
print(err.debugDescription)
} else {
let responseStr = String(data: data!,
encoding: String.Encoding.utf8)
//print(responseStr!) //包體數(shù)據(jù)
//print("mimeType: (resp?.mimeType) ")
//URLResponse類里沒(méi)有http返回值, 需要先強(qiáng)制轉(zhuǎn)換馋吗!
if let response = resp as? HTTPURLResponse {
print("code\ (response.statusCode)")
for (tab, result) in response.allHeaderFields {
print("(tab.description) - (result)")
}
if response.statusCode == 200 {
//JSON解析焕盟, 做邏輯
} else {
//通知UI接口執(zhí)行失敗
}
}
}
} ) as URLSessionTask
let beginDate = Date()
print("開始任務(wù), 時(shí)間:\(beginDate.timeIntervalSince1970)")
dataTask.resume() //執(zhí)行任務(wù)
let endDate = Date()
print("結(jié)束任務(wù)宏粤, 時(shí)間:\(endDate.timeIntervalSince1970))</pre>

這段代碼說(shuō)明幾個(gè)問(wèn)題:
1脚翘、 request.httpMethod參數(shù)可以修改HTTP的方法, 默認(rèn)是GET绍哎。


屏幕快照 2017-01-12 下午10.21.39.png

2来农、dataTask.resume()是異步執(zhí)行的,即不阻塞UI崇堰。 這里還有閉包的一個(gè)概念叫逃逸閉包沃于,對(duì)應(yīng)關(guān)鍵字@escapting, 它的意思是將閉包做為回調(diào)異步執(zhí)行(作用類似于Android的Runnable)海诲,調(diào)用時(shí)立刻返回繁莹。
<pre> open func dataTask(with request: URLRequest, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Swift.Void) -> URLSessionDataTask</pre>執(zhí)行日志:
<pre>創(chuàng)建任務(wù), 時(shí)間:1484230880.29283
開始任務(wù)特幔, 時(shí)間:1484230880.30001
結(jié)束任務(wù)咨演, 時(shí)間:1484230880.30009
http返回, 時(shí)間:1484230881.42724 </pre>

3蚯斯、 http交互成功后要判斷返回值薄风, 作為初學(xué)者我翻遍了URLResponse的方法, 就是沒(méi)有status code拍嵌。遭赂。。 后來(lái)無(wú)意中發(fā)現(xiàn)了HTTPResponse類撰茎, 試著強(qiáng)轉(zhuǎn)并輸出它的成員變量嵌牺, 果然好用。
<pre>code 200
Server - Apache
Content-Type - application/json
Transfer-Encoding - Identity
Date - Thu, 12 Jan 2017 14:21:21 GMT
Proxy-Connection - Keep-alive
Tracecode - 12812437700874983946011222</pre>

4、http執(zhí)行成功后就是要解析包體并做業(yè)務(wù)邏輯了逆粹, responseStr就是我們最終需要的json字符串募疮, 我們需要反序列化并做邏輯。
<pre> if response.statusCode == 200 {
//JSON解析僻弹, 做邏輯
} else {
//通知UI接口執(zhí)行失敗
}</pre>

二阿浓、 下載文件, 使用URLSession的API, 代碼很簡(jiǎn)單蹋绽。 重點(diǎn)是存儲(chǔ)位置芭毙, iOS會(huì)自動(dòng)生成一個(gè)臨時(shí)文件。 我們要做的是拷貝這個(gè)文件到我們想要的目錄下卸耘。
<pre>let url = URL(string: "http://img.pconline.com.cn/images/upload/upc/tx/wallpaper/1307/23/c0/23656308_1374564438338_800x600.jpg")
let request = URLRequest(url: url!)
let downloadTask = session.downloadTask(with: request)
downloadTask.resume() //開始下載任務(wù)

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
print("下載結(jié)束退敦, 存儲(chǔ)在(location.path)")
}

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {

    print("total: \(totalBytesWritten), current: \(bytesWritten)")  //下載進(jìn)度

}
</pre>

日志:
<pre> total: 46276, current: 46276
下載結(jié)束, 存儲(chǔ)在/Users/brycegao/Library/Developer/CoreSimulator/Devices/8BE9C62E-042E-4B50-8F5D-78F857533650/data/Containers/Data/Application/3A6EB44A-2F88-4E79-9CFC-87713B9FC2E0/tmp/CFNetworkDownload_tnAj6u.tmp
</pre>

三蚣抗、上傳文件侈百, 因?yàn)闆](méi)有測(cè)試服務(wù)器,無(wú)法調(diào)試翰铡。 代碼跟上傳文件類似钝域。
<pre>let uploadTask = session.uploadTask(with: request, from: data) {
(data:Data?, response:URLResponse?, error:Error?) -> Void in
//上傳完畢
if error != nil{
print(error)
}else{
let str = String(data: data!, encoding: String.Encoding.utf8)
print("上傳完畢:(str)") //str是包體
}
}</pre>

小結(jié): iOS對(duì)HTTP/HTTPS交互封裝個(gè)一套完整方便的API,主要涉及URLSession锭魔、URLSesionTask例证、URLCache及其派生類; 支持文件迷捧、上傳/下載文件织咧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市党涕,隨后出現(xiàn)的幾起案子烦感,更是在濱河造成了極大的恐慌巡社,老刑警劉巖膛堤,帶你破解...
    沈念sama閱讀 210,835評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異晌该,居然都是意外死亡肥荔,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,900評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門朝群,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)燕耿,“玉大人,你說(shuō)我怎么就攤上這事姜胖∮В” “怎么了?”我有些...
    開封第一講書人閱讀 156,481評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蚜锨。 經(jīng)常有香客問(wèn)我档插,道長(zhǎng),這世上最難降的妖魔是什么亚再? 我笑而不...
    開封第一講書人閱讀 56,303評(píng)論 1 282
  • 正文 為了忘掉前任郭膛,我火速辦了婚禮,結(jié)果婚禮上氛悬,老公的妹妹穿的比我還像新娘则剃。我一直安慰自己,他們只是感情好如捅,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,375評(píng)論 5 384
  • 文/花漫 我一把揭開白布棍现。 她就那樣靜靜地躺著,像睡著了一般镜遣。 火紅的嫁衣襯著肌膚如雪轴咱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,729評(píng)論 1 289
  • 那天烈涮,我揣著相機(jī)與錄音朴肺,去河邊找鬼。 笑死坚洽,一個(gè)胖子當(dāng)著我的面吹牛戈稿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播讶舰,決...
    沈念sama閱讀 38,877評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼鞍盗,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了跳昼?” 一聲冷哼從身側(cè)響起般甲,我...
    開封第一講書人閱讀 37,633評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鹅颊,沒(méi)想到半個(gè)月后敷存,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,088評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡堪伍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,443評(píng)論 2 326
  • 正文 我和宋清朗相戀三年锚烦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帝雇。...
    茶點(diǎn)故事閱讀 38,563評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡涮俄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出尸闸,到底是詐尸還是另有隱情彻亲,我是刑警寧澤孕锄,帶...
    沈念sama閱讀 34,251評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站苞尝,受9級(jí)特大地震影響硫惕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜野来,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,827評(píng)論 3 312
  • 文/蒙蒙 一恼除、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧曼氛,春花似錦豁辉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,712評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至聊浅,卻和暖如春餐抢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背低匙。 一陣腳步聲響...
    開封第一講書人閱讀 31,943評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工旷痕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人顽冶。 一個(gè)月前我還...
    沈念sama閱讀 46,240評(píng)論 2 360
  • 正文 我出身青樓欺抗,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親强重。 傳聞我的和親對(duì)象是個(gè)殘疾皇子绞呈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,435評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件间景、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,058評(píng)論 4 62
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,724評(píng)論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理佃声,服務(wù)發(fā)現(xiàn),斷路器倘要,智...
    卡卡羅2017閱讀 134,626評(píng)論 18 139
  • 完整 APP list AccountBook:一款記賬APP圾亏,使用了 iCloud 以及 Core Data 網(wǎng)...
    Tpphha閱讀 716評(píng)論 0 4
  • Browser 瀏覽器
    高剛高剛閱讀 186評(píng)論 0 0