[Xcode10 实际操作]八、网络与多线程-(11)使用同步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         var request = URLRequest.init(url:url!,
38         cachePolicy: NSURLRequest.CachePolicy.useProtocolCachePolicy,
39         timeoutInterval: 30)
40
41         //设置网络通信方式为Post,默认为Get请求
42         //相比Get请求,Post具有传送的数量较大,安全性较高,
43         //但执行效率相对较低的特点
44         request.httpMethod = "POST"
45
46         //初始化一个信号量,它是一种用来控制并发访问资源的机制,
47         //常用于多线程中,可以控制并发线程的数量。
48         //这里设置信号量为0,使线程一直等待,从而产生同步请求的效果。
49         let semaphore = DispatchSemaphore(value: 0)
50
51         //网址会话URLSession在2013年发布,苹果对它的定位是作为旧的网络请求接口的替代者。
52         //这里获得网址会话的单例对象
53         let session = URLSession.shared
54         //所有网络请求工作,都是通过网址会话任务对象来完成的。
55         //可以使用闭包、代理或者两者混合的方式,来创建网络请求任务。
56         let task = session.dataTask(with: request, completionHandler: {(data, response, error) -> Void in
57             //如果出现网络请求错误,
58             if error != nil{
59                 //则在控制台打印输出错误代码和错误信息
60                 print(error.debugDescription)
61             }else{
62                 //将网络返回的数据对象,根据指定的编码方式,转换为字符串
63                 let result = String(data: data!, encoding: String.Encoding.utf8)
64                  //然后返回主线程,
65                 DispatchQueue.main.async(execute: { () -> Void in
66                     //更新标签对象的文字内容
67                     //界面元素的刷新,需要在主线程进行
68                     self.label.text = result! as String
69                 })
70             }
71             //将信号量进行发送,使信号量加1,
72             //此时其他等待中的线程就会被唤醒,
73             //从而完成同步网络请求的操作
74             semaphore.signal()
75         })
76
77         //任务创建后,调用resume方法开始工作。
78         task.resume()
79         //等待信号量,timeout参数可以控制等待的最长时间,distantFuture表示永久等待
80         _ = semaphore.wait(timeout: DispatchTime.distantFuture)
81         //在网络的同步请求结束之后,在控制台输出日志信息
82         print("Task completed.")
83     }
84
85     override func didReceiveMemoryWarning() {
86         super.didReceiveMemoryWarning()
87         // Dispose of any resources that can be recreated.
88     }
89 }

原文地址:https://www.cnblogs.com/strengthen/p/10060701.html

时间: 2024-11-13 03:43:07

[Xcode10 实际操作]八、网络与多线程-(11)使用同步Post方式查询IP地址信息的相关文章

[Xcode10 实际操作]八、网络与多线程-(8)使用同步Get方式查询某地天气

本文将演示如果通过Get的方式,请求某地天气信息,同步获取网络数据, 一旦发送同步请求,程序将停止用户交互,直至服务器返回数据. 为了增强数据访问的安全性,从9.0版本开始,Xcode默认会把所有的网络请求,修改为https安全请求. 也可以修改配置文件,以支持普通的网络请求. 点击打开[Info.plist]属性列表文件. 在配置文件编辑区的空白处,点击鼠标右键,弹出功能菜单. ->[Add Row] ->[Information Property List]在键列表中选择需要设置的键[Ap

[Xcode10 实际操作]八、网络与多线程-(17)使用网址会话对象URLSession向远程服务器上传图片

本文将演示如何通过网址会话对象URLSession向远程服务器上传图片. 网址会话对象URLSession具有在后台上传和下载.暂停和恢复网络操作.丰富的代理模式等优点. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] 1 import UIKit 2 3 class ViewController: UIViewController { 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 // D

[Xcode10 实际操作]八、网络与多线程-(5)使用UIApplication对象发送邮件

本文将演示如何使用应用程序单例对象,发送邮件的功能. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] 注:需要使用真机进行测试. 1 import UIKit 2 3 class ViewController: UIViewController { 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 // Do any additional setup after loading the view

[Xcode10 实际操作]八、网络与多线程-(6)使用UIApplication对象打开地图

本文将演示如何使用应用程序单例对象,打开地图的功能. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] 1 import UIKit 2 3 class ViewController: UIViewController { 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 // Do any additional setup after loading the view, typically fr

IP地址、子网掩码、网络号、主机号、网络地址、主机地址

对于192.168.0.0到192.168.0.255这个网络来说,以下说法中正确的是____. 正确答案: D   你的答案: D (正确) 网段内可用来作为主机IP的范围是:192.168.0.0到192.168.0.255 Network IP是192.168.0.255 Broadcast IP是192.168.0.0 网段内的主机可以通过网卡对网卡传递数据 192.168.0.1和192.168.0.2的主机需要使用Router传递数据包 是class B等级 添加笔记 求解答(4)

网络基础之IP地址和子网掩码

IP地址 IP是英文Internet Protocol的缩写,意思是"网络之间互连的协议",也就是为计算机网络相互连接进行通信而设计的协议.在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则.任何厂家生产的计算机系统,只要遵守IP协议就可以与因特网互连互通.正是因为有了IP协议,因特网才得以迅速发展成为世界上最大的.开放的计算机通信网络.因此,IP协议也可以叫做"因特网协议". 互联网是由许多小型网络

ip地址中的网络号,主机号

当前使用的IP地址有4个字节(32bit)组成,即IPV4编码方式.每个IP地址包括两部分:网络号和主机号.当分配给主机号的二进制位越多,则能标识的主机数就越多,相应地能标识的网络数就越少,反之同理. ip地址中的网络号,主机号有什么作用? 打个很简单的比喻:网卡的MAC地址就像你身份证上的身份证号码,虽然是唯一的,但是寻址起来很麻烦:而IP地址就像你的家庭详细地址,楼上说的对:每个IP地址都是由两部分构成:网络号,主机号.其中,网络号标识某个网络,主机号标识在该网络上的一个特定的主机.这样就形

【Linux网络编程】IP地址介绍

什么是 IP 地址IP 地址(Internet Protocol Address)也称为网间地址.网际地址.IP地址是指互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),是IP Address的缩写.IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异. IP 地址是?TCP/IP 协议栈?里的网络层地址方案,IP地址是一种用来对网络设备的逻辑标识. 举个生活中的例子,如果我要寄一

如果重新设计网络,有没有可能合并IP地址跟MAC地址?

前阵子看网络基础相关的书籍,冒过一个疑问,为什么要有MAC地址跟IP地址?两者可否合二为一? 现在的逻辑是这样子:在数据传输过程中,路由器查看这个数据包的IP地址,跟路由表中记录的“IP集合:下一跳的mac地址”做对照,确定了要往那边扔:网卡在接收数据的时候,也会看看这个数据包中记录的目标MAC地址是不是自己,只接收自己的. MAC地址是数据链路层使用到的,IP地址是网络层使用到的.MAC地址是硬件的物理属性,在网卡上固定不变,IP地址是逻辑属性. 所以,因为网络分层的设计,很自然的就想到要使用