[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 }

猜你喜欢

转载自www.cnblogs.com/strengthen/p/10060767.html