第五篇我们实现了利用网页去读取数据,但是这显然不是最好的办法。我们应该写一个手机APP来显示每一项的数据,这样更有逻辑更有条理。
一 环境
iphoneX, macOS10.13,xcode9
首先是我们的基本界面:
4个label空间,一个button控件。没什么好说的,直接看程序:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var tempLabel: UILabel!
@IBOutlet weak var humLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func getDataFromServer(_ sender: Any) {
let urlString = "http://zyltest.3w.dkys.org/phone?op=getdata"
let url = URL(string:urlString)
let request = URLRequest(url:url!)
let session = URLSession.shared
let dataTask = session.dataTask(with: request,
completionHandler:{(data, response, error)->Void in
if error != nil{
print(error.debugDescription)
}else{
let str = String(data: data!, encoding: String.Encoding.utf8)
let data = str?.split(separator: ",").map(String.init)
let temp = data![0]
let hum = data![1]
DispatchQueue.main.async(execute: {
self.tempLabel.text = temp
self.humLabel.text = hum
})
}
}) as URLSessionTask
dataTask.resume()
}
}
其他代码都是Xcode生成的,我们主要的代码是这个函数:@IBAction func getDataFromServer(_ sender: Any)
这是一个事件函数,它代表按钮控件被点击了一下。即:按钮被点击,就会运行这个函数。
函数首先定义了要访问的IP地址,也就是上一篇内网穿透之后的网址。
然后,利用session.dataTask开启了GET访问,它有两个参数,一个是request,一个是回调函数。request就是GET请求,毁掉函数就是当我们接收到服务器的返回信息时,要做些什么。
这个回调函数有三个参数:data,response,error。分别代表:返回的数据,服务器对请求的响应,错误。接下来的if语句则是判断这次GET请求有没有错误,有错误就把错误打印出来,在Xcode中显示。没有错误就开始分析data。data代表服务器返回的数据,也就是上一篇中,服务器程序的return语句。
服务器返回"temp,hum",它有三个部分,温度temp,逗号“,”和湿度hum,我们要将温度和湿度分开,所以使用了split方法,利用“,”将两者分开。
IOS系统对UI的更新,是在主线程中。而session.dataTask对网络的请求则发生在子线程中,在子线程中更新UI会导致警告,并且更新速度会非常非常慢。所以,我们使用 DispatchQueue.main.async方法,将UI的更新同步到主线程中。
将APP下载到手机中,如下图所示: