zoukankan      html  css  js  c++  java
  • [Xcode 实际操作]八、网络与多线程-(12)使用异步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         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 }
  • 相关阅读:
    Uni项目启动微信、QQ、淘宝、抖音、京东等APP的方法
    input 标签为checkbox时修改 checkbox的样式
    关于CSS HACK
    前端JS生成可用的MD5加密代码
    把ucharts 封装成组件
    学期总结
    作业1
    作业02
    C语言I博客作业09
    C语言I博客作业08
  • 原文地址:https://www.cnblogs.com/strengthen/p/10060767.html
Copyright © 2011-2022 走看看