1. 程式人生 > >[Xcode10 實際操作]八、網路與多執行緒-(12)使用非同步Post方式查詢IP地址資訊

[Xcode10 實際操作]八、網路與多執行緒-(12)使用非同步Post方式查詢IP地址資訊

本文將演示如何通過Post請求,非同步獲取IP地址資訊。

非同步請求與同步請求相比,不會阻塞程式的主執行緒,而會建立一個新的執行緒。

在專案導航區,開啟檢視控制器的程式碼檔案【ViewController.swift】

 1 import UIKit
 2 
 3 class ViewController: UIViewController {
 4     
 5     //給當前檢視控制器類,新增一個標籤屬性。
 6     //該標籤物件,將用來顯示遠端伺服器返回的資訊
 7     var label = UILabel()
 8     
 9     override
func viewDidLoad() { 10 super.viewDidLoad() 11 // Do any additional setup after loading the view, typically from a nib. 12 13 //設定標籤物件的位置在(20,40),尺寸為(280,500) 14 label.frame = CGRect(x: 20, y: 40, width: 280, height: 500) 15 //設定標籤物件的文字內容 16 label.text = "
Loading..." 17 //設定標籤物件的字型和大小 18 label.font = UIFont(name: "Arial", size: 14) 19 //設定標籤物件的背景顏色為淺灰色 20 label.backgroundColor = UIColor.lightGray 21 //設定標籤物件的行數屬性值為0,表示不限制標籤物件的行數 22 label.numberOfLines = 0 23 //遠端伺服器有可能返回較多的文字內容, 24 //在此設定標籤物件在進行換行時,保留所有的字元
25 label.lineBreakMode = NSLineBreakMode.byWordWrapping 26 //將設定好的標籤物件,新增到當前檢視控制器的根檢視 27 self.view.addSubview(label) 28 29 //建立一個網址物件,指定請求網路資料的網址, 30 //網址最後面的引數,代表需要查詢的IP地址。 31 let url = URL(string: "http://ip.taobao.com/service/getIpInfo.php?ip=63.223.108.42") 32 33 //建立一個網路請求物件,引數說明: 34 //1.代表請求訪問的路徑 35 //2.代表網路請求的快取協議 36 //3.代表網路請求的超時時間 37 let request = URLRequest.init(url: url!, 38 cachePolicy: .useProtocolCachePolicy, 39 timeoutInterval: 30) 40 41 //設定網路通訊方式為Post,預設為Get請求 42 //相比Get請求,Post具有傳送的數量較大,安全性較高, 43 //但執行效率相對較低的特點 44 request.httpMethod = "POST" 45 46 //網址會話URLSession在2013年釋出,蘋果對它的定位是作為舊的網路請求介面的替代者。 47 //這裡獲得網址會話的單例物件 48 let session = URLSession.shared 49 //所有網路請求工作,都是通過網址會話任務物件來完成的。 50 //可以使用閉包、代理或者兩者混合的方式,來建立網路請求任務。 51 //建立一個網路請求任務,根據指定的網址請求物件,獲取介面的內容, 52 //並在完成時通過閉包語句,處理伺服器返回的資料 53 let task = session.dataTask(with: request, completionHandler: {(data, response, error) -> Void in 54 //如果出現網路請求錯誤, 55 if error != nil{ 56 //則在控制檯列印輸出錯誤程式碼和錯誤資訊 57 print(error.debugDescription) 58 }else{ 59 //如果網路請求成功,則對網路返回的結果進行處理。 60 //將網路返回的資料物件,根據指定的編碼方式,轉換為字串 61 let result = String(data: data!, encoding: String.Encoding.utf8) 62 //當在一個執行緒中,需要更改介面元素時,需要返回程式的主執行緒 63 DispatchQueue.main.async(execute: { () -> Void in 64 //更新標籤物件的文字內容 65 self.label.text = result! as String 66 }) 67 } 68 }) 69 70 //任務建立後,呼叫resume方法開始工作。 71 task.resume() 72 73 } 74 75 override func didReceiveMemoryWarning() { 76 super.didReceiveMemoryWarning() 77 // Dispose of any resources that can be recreated. 78 } 79 }