Alamofire 升級到4.0后不支持iOS8了障涯,你敢信罐旗?
作為一個同時用Swift和OC寫iOS項目的猿,一年一次大升級唯蝶,Swift的升級比生孩子還快九秀,相信經歷過的人,都深受其害粘我。在我現(xiàn)在開發(fā)的項目中用的是Alamofire3.0鼓蜒,沒想到Christian Noon大神升級到4.0后竟然又不支持iOS8了,( ̄▽ ̄)找誰說理去征字。有時間真應該自己封一個好用的網絡庫出來都弹。
有些輕量級的APP是不需要AFNetworking或者是Alamofire的,我們完全可以封一個簡單的網絡請求工具匙姜,以減少對第三方庫的依賴畅厢,而且自己寫的也方便維護,下面就寫個簡單的例子氮昧, NSURLSession是蘋果公司在iOS7新推出的類框杜,旨在替代NSURLConnection,用起來十分的方便袖肥。代碼還是2.X版本的代碼咪辱。
let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
let request = NSURLRequest(URL: NSURL(string: "http://yourapi.com/endpoint")!)
let task: NSURLSessionDataTask = session.dataTaskWithRequest(request) { (data, response, error) -> Void in
if let data = data {
let response = NSString(data: data, encoding: NSUTF8StringEncoding)
print(response)
}
}
task.resume()
這個對比起NSURLConnection真是好太多了,這個類自帶回調block椎组,就跟我們再調用三方庫差不多的寫法油狂,不需要配置特別的configured,注意閉包返回的是三個optionals:data包含的是我們需要的NSData數(shù)據(jù)寸癌,response包含的是NSURLResponse专筷,最后一個是error信息
用到一個輕量級的APP的寫法,以JSON為例
private func dataTask(request: NSMutableURLRequest, method: String, completion: (success: Bool, object: AnyObject?) -> ()) {
request.HTTPMethod = method
let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
session.dataTaskWithRequest(request) { (data, response, error) -> Void in
if let data = data {
let json = try? NSJSONSerialization.JSONObjectWithData(data, options: [])
if let response = response as? NSHTTPURLResponse && response.statusCode >= 200 && response.statusCode <= 299{
completion(success: true, object: json)
} else {
completion(success: false, object: json)
}
}else{
completion(success: false, object: ["passedMessage":"error"])
}
}.resume()
}
我們再封裝幾個經常用帶的HTTP請求方式
private func post(request: NSMutableURLRequest, completion: (success: Bool, object: AnyObject?) -> ()) {
dataTask(request, method: "POST", completion: completion)
}
private func put(request: NSMutableURLRequest, completion: (success: Bool, object: AnyObject?) -> ()) {
dataTask(request, method: "PUT", completion: completion)
}
private func get(request: NSMutableURLRequest, completion: (success: Bool, object: AnyObject?) -> ()) {
dataTask(request, method: "GET", completion: completion)
}
注意:這里的method可以封裝成rowValue為String類型的枚舉灵份,方便閱讀和調用仁堪。
接下來我們再封裝一個我們需要的request,我們在這里編輯我們需要的參數(shù)和IP地址填渠,記得如果有authorization token的話弦聂,也需要編輯鸟辅。
private func APPURLRequest(path: String, params: Dictionary<String, AnyObject>? = nil) -> NSMutableURLRequest {
let request = NSMutableURLRequest(URL: NSURL(string: "http://api.website.com/"+path)!)
if let params = params {
var paramString = ""
for (key, value) in params {
let escapedKey = key.stringByAddingPercentEncodingWithAllowedCharacters(.URLQueryAllowedCharacterSet())
let escapedValue = value.stringByAddingPercentEncodingWithAllowedCharacters(.URLQueryAllowedCharacterSet())
paramString += "\(escapedKey)=\(escapedValue)&"
}
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.HTTPBody = paramString.dataUsingEncoding(NSUTF8StringEncoding)
}
if let token = token {
request.addValue("Bearer "+token, forHTTPHeaderField: "Authorization") }
return request
}
因為我們可能用的是參數(shù)可能為nil,所以可以設置一個默認值
最后我們就可以進行我們的HTTP請求了莺葫,如果是POST請求匪凉,且請求參數(shù)比較多的時候,我們們可以再寫一個參數(shù)模型捺檬,然后寫個小工具再层,將模型轉成字典,面向模型開發(fā)堡纬。這是一個調用的小例子聂受。
func login(account:String,pwd:String,completion: (success: Bool, errorMsg: String?) -> ()) {
let loginParams= ["account": account, "password": pwd]
post(APPURLRequest("auth/login", params: loginParams)) { (success, object) -> () in
dispatch_async(dispatch_get_main_queue(), { () -> Void in
if success {
completion(success: true, errorMsg: nil)
} else {
var errorMsg= "error"
if let object = object, let passedMessage = object["message"] as? String {
errorMsg= passedMessage
}
completion(success: true, errorMsg: errorMsg)
}
})
}
}
注意登陸成功需要存儲一些必須的信息,比如:令牌
以上就是簡單的網絡封裝了
其實我們的網絡細節(jié)往往取決于我們的服務器烤镐,靈活的編寫與服務器配套的API是必要的蛋济。
其實這樣的寫法還是OC的寫法,下篇文章將對網絡請求進行更Swift的封裝炮叶。