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 }
  • 相关阅读:
    Leetcode 538. Convert BST to Greater Tree
    Leetcode 530. Minimum Absolute Difference in BST
    Leetcode 501. Find Mode in Binary Search Tree
    Leetcode 437. Path Sum III
    Leetcode 404. Sum of Left Leaves
    Leetcode 257. Binary Tree Paths
    Leetcode 235. Lowest Common Ancestor of a Binary Search Tree
    Leetcode 226. Invert Binary Tree
    Leetcode 112. Path Sum
    Leetcode 111. Minimum Depth of Binary Tree
  • 原文地址:https://www.cnblogs.com/strengthen/p/10060767.html
Copyright © 2011-2022 走看看