Alamofire 升級到4.0后

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的封裝炮叶。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末碗旅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子镜悉,更是在濱河造成了極大的恐慌祟辟,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侣肄,死亡現(xiàn)場離奇詭異旧困,居然都是意外死亡,警方通過查閱死者的電腦和手機茫孔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門叮喳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人缰贝,你說我怎么就攤上這事馍悟。” “怎么了剩晴?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵锣咒,是天一觀的道長。 經常有香客問我赞弥,道長毅整,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任绽左,我火速辦了婚禮悼嫉,結果婚禮上,老公的妹妹穿的比我還像新娘拼窥。我一直安慰自己戏蔑,他們只是感情好蹋凝,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著总棵,像睡著了一般鳍寂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上情龄,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天迄汛,我揣著相機與錄音,去河邊找鬼骤视。 笑死鞍爱,一個胖子當著我的面吹牛,可吹牛的內容都是我干的尚胞。 我是一名探鬼主播硬霍,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼笼裳!你這毒婦竟也來了?” 一聲冷哼從身側響起粱玲,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤躬柬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后抽减,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體允青,經...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年卵沉,在試婚紗的時候發(fā)現(xiàn)自己被綠了颠锉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡史汗,死狀恐怖琼掠,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情停撞,我是刑警寧澤瓷蛙,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站戈毒,受9級特大地震影響艰猬,放射性物質發(fā)生泄漏。R本人自食惡果不足惜埋市,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一冠桃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧道宅,春花似錦食听、人聲如沸套么。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胚泌。三九已至,卻和暖如春肃弟,著一層夾襖步出監(jiān)牢的瞬間娄柳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工慷嗜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留为迈,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓箩兽,卻偏偏與公主長得像津肛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子汗贫,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內容

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