Alamofire 升級到4.0后

Alamofire 升級到4.0后不支持iOS8了,你敢信?

作為一個同時用Swift和OC寫iOS項目的猿,一年一次大升級,Swift的升級比生孩子還快,相信經歷過的人,都深受其害。在我現在開發的項目中用的是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數據,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,我們在這里編輯我們需要的參數和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
}

因為我們可能用的是參數可能為nil,所以可以設置一個默認值

最后我們就可以進行我們的HTTP請求了,如果是POST請求,且請求參數比較多的時候,我們們可以再寫一個參數模型,然后寫個小工具,將模型轉成字典,面向模型開發。這是一個調用的小例子。

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)
          }
      })
  }
}

注意登陸成功需要存儲一些必須的信息,比如:令牌
以上就是簡單的網絡封裝了

其實我們的網絡細節往往取決于我們的服務器,靈活的編寫與服務器配套的API是必要的。
其實這樣的寫法還是OC的寫法,下篇文章將對網絡請求進行更Swift的封裝。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,232評論 4 61
  • 一.UITableView tableView 是項目開發里經常用到的控件,剛開始使用時可能會覺得這玩意功能強大但...
    才寒閱讀 2,506評論 0 5
  • 年幼時父母環繞你,如同救世主般 時時刻刻被關注。成人后才發覺我等 平凡 的如同沙海中的一粒,望去 和其他沙子沒有區...
    4d8ef48cfd78閱讀 262評論 0 0