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 }

然后运行就可以了:

posted @ 2015-07-14 11:32  何杨  阅读(621)  评论(0编辑  收藏  举报