swift网络编程入门应用:天气预报
学习来自《小波说雨燕 第二季 网络编程(入门篇)》
工具:xcode6.4
首先在Main.storyborad中添加并设置好三个label做简单的界面显示:
1 import UIKit 2 3 //1、construct a constructs 4 struct Weather { 5 var city: String? 6 var weather: String? 7 var temp: String? 8 }//为什么不实用class呢,因为结构体初始化方便,不用写初始化方法 9 10 11 12 class ViewController: UIViewController { 13 14 @IBOutlet weak var labelCity: UILabel! 15 @IBOutlet weak var labelWeather: UILabel! 16 @IBOutlet weak var labelTemp: UILabel! 17 18 //3、接下来需要加一个计算属性 19 var weatherData:Weather?{ 20 //4、发生变化的话,用swift独有的语法 21 didSet { 22 configView() 23 } 24 } 25 26 //2、然后考虑到:一启动app就是要刷新数据,所以需要这么一个方法 27 func configView(){ 28 labelCity.text = self.weatherData?.city 29 labelWeather.text = self.weatherData?.weather 30 labelTemp.text = self.weatherData?.temp 31 } 32 33 //4、新建一个获取天气数据的方法 34 func getWeatherData() 35 { 36 //NSURLSession 37 //<1>资源定位 NSURL 加载的网址 38 let url = NSURL(string: "http://api.k780.com:88/?app=weather.today&weaid=238&&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json") 39 println(url!) 40 //<2>URL Session Configuration(URL会话配置):磁盘缓存、内存缓存、系统后台执行。下面用默认的磁盘缓存 41 let config = NSURLSessionConfiguration.defaultSessionConfiguration() 42 println(config) 43 config.timeoutIntervalForRequest = 10//配置超时时间,即用户加载网络的时间10秒以内 44 //<3>建立会话 45 let session = NSURLSession(configuration: config) 46 47 //<4>会话的任务 48 let task = session.dataTaskWithURL(url!, completionHandler: { (data,_, error) -> Void in 49 //<6>如果连接没有错误,则处理数据 50 if error == nil { 51 if let json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments, error: nil)as?NSDictionary{ 52 //下面获取数据转为字典,然后把json对象,直接实例化成自定义的对象,这步相对复杂,因为用到一个map函数 53 let weather:Weather = (json.valueForKey("result") as? NSDictionary).map{ 54 Weather( 55 city: $0["citynm"] as? String 56 ,weather: $0["weather"] as? String 57 ,temp: $0["temperature_curr"] as? String 58 ) 59 }! 60 //<8>更新界面却很慢,是因为更新界面不在主线程中,所以要在主线程中跟新这个界面 61 dispatch_async(dispatch_get_main_queue(), { 62 ()->Void in 63 //<7>获取数据之后,就要在视图中显示 64 self.weatherData = weather 65 }) 66 67 68 } 69 } 70 })//第二个参数就是task完成之后要做的操作 71 //<5>执行任务 72 task.resume() 73 74 75 } 76 override func viewDidLoad() { 77 super.viewDidLoad() 78 getWeatherData() 79 } 80 81 override func didReceiveMemoryWarning() { 82 super.didReceiveMemoryWarning() 83 } 84 85 86 }
然后运行就可以了: