[Xcode 實際操做]8、網絡與多線程-(8)使用同步Get方式查詢某地天氣

目錄:[Swift]Xcode實際操做html

本文將演示若是經過Get的方式,請求某地天氣信息,同步獲取網絡數據,swift

一旦發送同步請求,程序將中止用戶交互,直至服務器返回數據。緩存

爲了加強數據訪問的安全性,從9.0版本開始,Xcode默認會把全部的網絡請求,修改成https安全請求。安全

也能夠修改配置文件,以支持普通的網絡請求。服務器

點擊打開【Info.plist】屬性列表文件。網絡

在配置文件編輯區的空白處,點擊鼠標右鍵,彈出功能菜單。session

->【Add Row】多線程

->【Information Property List】在鍵列表中選擇須要設置的鍵【App Transport Security Settings】閉包

->點擊鍵左側的右向箭頭,顯示所屬的選項。併發

->點擊鍵右側的【+】添加一個子屬性。

->在鍵名輸入框內選擇【Allow Arbitrary Loads】選擇容許加載非安全請求的屬性名稱。

->點擊子屬性的值,更改布爾值爲真Yes。

在項目導航區,打開視圖控制器的代碼文件【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: 12)
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         //網址最後面的一串數字,表示某地區的編號,此處表明北京地區
31         let url = URL(string: "http://www.weather.com.cn/data/sk/101010100.html")
32         
33         //建立一個網絡請求對象,參數說明:
34         //1.表明請求訪問的路徑
35         //2.表明網絡請求的緩存協議
36         //3.表明網絡請求的超時時間
37         let request = URLRequest.init(url:url!, //1.表明請求訪問的路徑
38         cachePolicy: NSURLRequest.CachePolicy.useProtocolCachePolicy, //2.表明網絡請求的緩存協議
39         timeoutInterval: 30)//3.表明網絡請求的超時時間
40         
41         //初始化一個信號量,它是一種用來控制併發訪問資源的機制,
42         //經常使用於多線程中,能夠控制併發線程的數量。
43         //這裏設置信號量爲0,使線程一直等待,從而產生同步請求的效果。
44         let semaphore = DispatchSemaphore(value: 0)
45         
46         //網址會話URLSession在2013年發佈,蘋果對它的定位是做爲舊的網絡請求接口的替代者。
47         //這裏得到網址會話的單例對象
48         let session = URLSession.shared
49         //全部網絡請求工做,都是經過網址會話任務對象來完成的。
50         //可使用閉包、代理或者二者混合的方式,來建立網絡請求任務。
51         let task = session.dataTask(with: request, completionHandler: {(data, response, error) -> Void in
52             //若是出現網絡請求錯誤,
53             if error != nil{
54                 //則在控制檯打印輸出錯誤代碼和錯誤信息
55                 print(error.debugDescription)
56             }else{
57                 //將網絡返回的數據對象,根據指定的編碼方式,轉換爲字符串
58                 let result = String(data: data!, encoding: String.Encoding.utf8)
59                 //而後返回主線程,
60                 DispatchQueue.main.async(execute: { () -> Void in
61                     //更新標籤對象的文字內容
62                     //界面元素的刷新,須要在主線程進行
63                     self.label.text = result! as String
64                 })
65             }
66 
67             //將信號量進行發送,使信號量加1,
68             //此時其餘等待中的線程就會被喚醒,
69             //從而完成同步網絡請求的操做
70             semaphore.signal()
71         })
72         
73         //任務建立後,調用resume方法開始工做。
74         task.resume()
75         
76         //等待信號量,timeout參數能夠控制等待的最長時間,distantFuture表示永久等待
77         _ = semaphore.wait(timeout: DispatchTime.distantFuture)
78         //在網絡的同步請求結束以後,在控制檯輸出日誌信息
79         print("數據加載完畢!")        
80     }
81     
82     override func didReceiveMemoryWarning() {
83         super.didReceiveMemoryWarning()
84         // Dispose of any resources that can be recreated.
85     }
86 }
相關文章
相關標籤/搜索