假设现在请求北京的天气预报,已知API地址。
let session = URLSession.shared
let cityName = "北京" //参考 CoreLocation使用 链接:确定当前city位置)
let urlString ="http://wthrcdn.etouch.cn/weather_mini?city=\(cityName)"
.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
let url = URL(string: urlString!)
let task = session.dataTask(with: url!, completionHandler: {
(data,responder,error) in
if error == nil{
let str = String(data: data!, encoding: String.Encoding(rawValue: 4))
print(str!) //打印看看
// 一、如果是解析 JSON:
let weatherInfo = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! NSDictionary
//自己先打印看看原json数据啥样的
let dict1 = weatherInfo!["data"] as! NSDictionary
let arr1 = dict1["forecast"] as! NSArray
let dict2 = arr1[0] as! NSDictionary
let infoStr = dict2["date"] as! String
print(infoStr)
// 得到数据,用GCD去更新页面:关于GCD, 链接: 队列
DispatchQueue.main.async {
// 主线程更新 UI
}
}
})
task.resume()
// 二、如果是解析 XML:
// 假设url返回的是xml的数据,先给 ViewController 实现协议: xmlParser
// 在刚才这句话:if error == nil { 后面 改成:
let xmlParser = NSXMLParser(data:data!)
xmlParser.delegate = self
xmlParser.parse() // 解析.下面实现协议方法
// xml是一步一步解析,json是全解析完了才用,返回数据较大时,选 xml
//当前节点名,在成员中声明(不是在方法里):
var currentNodeName:String!
// 实现协议方法:
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
currentNodeName = elementName
}
//解析完成拿到节点真正的值
func parser(_ parser: XMLParser, foundCharacters string: String) {
//string表示节点值
let newStr = string.trimmingCharacters(in: .whitespacesAndNewlines)
if newStr != "" {
print("\(currentNodeName) -> \(newStr)")
}
}