作實際項目老是離不開這兩步,大多數狀況下都是採用第三方框架來輔助完成,swift也不例外,因爲swift並不成熟,用swift語言寫的第三方框架很不穩定(蘋果更新太快了),所幸swift和oc能夠混編,因此本次使用的框架都是oc裏面經常使用的。網絡請求使用AFNetworking,json解析使用MJExtension。
下面開始正文:javascript
1. swift中使用oc框架java
其原理很簡單,須要一個.h頭文件,裏面導入咱們須要使用的oc框架的頭文件,把這個.h文件配置到項目設置中便可json
1).咱們採起一個不容易出錯的方法來建立.h文件,在swift項目中新建oc類swift
注意語言選擇oc語言,建立完後,xcode會有這麼一個提示api
詢問是否建立一個橋街頭,這波很關鍵,點建立
xcode
如圖,建立完後在項目設置那裏會有配置這個文件的,若是本身建立本身配置,很容易把路徑寫錯~
接下來測試一下咱們是否配置正確
在前面建立的test類中寫一個方法,而且在swift中調用markdown
在上面的橋街頭文件中導入test.h (很關鍵!)
網絡
在swift中調用測試
框架
通常會高亮而且能自動提示就沒啥子問題了、測試
2. 引入第三方框架並調用
這裏就很簡單了,直接把代碼拷貝進來,導入頭文件就好了
而且在橋街頭文件中導入框架包
#import "AFNetworking.h"
#import "MJExtension.h"
至於框架的使用方法,我就再也不贅述,官方文檔寫的很清楚了、
let manager = AFHTTPSessionManager()
let url = "http://op.juhe.cn/onebox/weather/query?cityname=%e6%b7%b1%e5%9c%b3&key=eb08f814be6e473ec5ad9a6bde57e5e5&dtype=json"
manager.GET(url, parameters: nil, success: { ( datatask :NSURLSessionDataTask, object :AnyObject?) in
NSLog("請求成功")
},failure: { (datask, object) in
NSLog("請求失敗%@",object)
})
還有一個要注意的,在高版本的xcode中,不容許使用http請求(只容許HTTPS),須要在項目的plist文件中加入這麼一段
<key>NSAppTransportSecurity</key><dict>
<key>NSAllowsArbitraryLoads</key>
<true/></dict>
測試一下,若是上述配置正確的話,是可以打印請求成功的~
3.請求成功後的數據解析
看回調方法上,object就是返回的數據,可是他是一個anyobject類型,就至關於oc裏面的id類型(任意類型),實測返回的是一個字典類型,假若你想打印出來,須要先強轉成字典(oc裏面能夠直接打印)
let dict : NSDictionary = object as! NSDictionary
NSLog("%@", dict)
框架已經幫咱們轉成字典類型了,如今要作的就是字典轉模型了
4.複雜json解析&模型的寫法
上面咱們已經取到了字典了,其實已經能夠利用系統的方法來字典轉模型,可是對於比較複雜的json數據,系統的方法仍是須要讓咱們寫不少的代碼~
此次用來測試的json數據是天氣預報的,放出接口文檔,上面有返回的json示例,若是你把上面的字典打印出來了,你也將看到大體結構
模型類
class WeatherBean: NSObject {
var reason : String!
var error_code : NSNumber!
var result : Result!
class Result: NSObject {
var data:Data!
}
class Data: NSObject {
var realtime:Realtime!
var life:Life!
var weather:Array<Weather2>!
var pm25:Pm25!
var date : String!
var isForeign : NSNumber!
}
class Realtime: NSObject {
var city_code:String!
var city_name:String!
var date:String!
var time:String!
var week:NSNumber!
var moon:String!
var dataUptime:NSNumber!
var weather:Weather!
var wind:Wind!
}
class Weather: NSObject {
var temperature:String!
var humidity:String!
var info:String!
var img:String!
}
class Wind: NSObject {
var direct:String!
var power:String!
var offset:String!
var windspeed:String!
}
class Life: NSObject {
var data:String!
var info:Info!
}
class Info: NSObject {
var chuanyi:Array<String>!
var ganmao:Array<String>!
var kongtiao:Array<String>!
var wuran:Array<String>!
var xiche:Array<String>!
var yundong:Array<String>!
var ziwaixian:Array<String>!
}
class Weather2: NSObject {
var date:String!
var info:Info2!
var week:String!
var nongli:String!
class Info2: NSObject {
var day:Array<String>!
var night:Array<String>!
}
}
class Pm25: NSObject {
var show_desc:String!
var pm25:Pm252!
var dateTime:String!
var key:String!
var cityName:String!
class Pm252: NSObject {
var pm25:String!
var curPm:String!
var pm10:String!
var level:String!
var quality:String!
var des:String!
}
}
}
最深大概4-5層,算的上是很複雜的了~
Java的小夥伴必定都用過gson,其實mj解析和這個很是像,模型類的寫法都一致
manager.GET(url, parameters: nil, success: { ( datatask :NSURLSessionDataTask, object :AnyObject?) in
let weat = WeatherBean.mj_objectWithKeyValues(object)
NSLog("請求成功"+weat.reason+weat.result.data.pm25.cityName)
},failure: { (datask, object) in
NSLog("請求失敗%@",object)
})
如此便能解析到全部的數據~
打個斷點,能夠看到更多數據哦
完~