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


    目录:[Swift]Xcode实际操作

    本文将演示如何通过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,  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 }
  • 相关阅读:
    springboot自定义消息转换器HttpMessageConverter
    fastJson的feature和SerializerFeature属性的解释
    ThreadLocal
    复习面向对象 -- 继承
    复习面向对象--创建对象
    js实现二分查找算法
    SVN问题解决--Attempted to lock an already-locked dir
    封装cookie设置和获取的简易方法
    JS判断客户端是否是iOS或者Android手机移动端(转载)
    【Vue笔记】-- 详解vue生命周期
  • 原文地址:https://www.cnblogs.com/strengthen/p/10060701.html
Copyright © 2020-2023  润新知