目錄:[Swift]Xcode實際操做php
本文將演示如何經過Post請求,異步獲取IP地址信息。html
異步請求與同步請求相比,不會阻塞程序的主線程,而會創建一個新的線程。swift
在項目導航區,打開視圖控制器的代碼文件【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 }