国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

自己動手寫一個 iOS 網絡請求庫——降低耦合

移動開發(fā) iOS 項目管理
現在的清湯掛面式的代碼雖然便于理解,但是功能單一,代碼雜亂。我們一起來分析 NSURLSession 的使用過程:

開源項目:Pitaya,適合大文件上傳的 HTTP 請求庫:https://github.com/johnlui/Pitaya

本文中,我們將一起降低之前代碼的耦合度,并使用適配器模式實現一層獨立于底層結構的網絡 API,造一個真正的網絡請求“庫”。

降低耦合度

如何降低耦合度

現在的清湯掛面式的代碼雖然便于理解,但是功能單一,代碼雜亂。我們一起來分析 NSURLSession 的使用過程:

構造 NSURLRequest

確定 URL

確定 HTTP 方法(GET、POST 等)

添加特定的 HTTP 頭

填充 HTTP Body

驅動 session.dataTaskWithRequest 方法,開始請求

具體實施

在 Network 下另外新建一個 NetworkManager 類,將 URL、params、files 等設為成員變量,讓他們在構造函數中初始化:

  1. class NetworkManager { 
  2.  
  3. let method: String! 
  4. let params: Dictionary let callback: (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void 
  5.  
  6. let session = NSURLSession.sharedSession() 
  7. let url: String! 
  8. var request: NSMutableURLRequest! 
  9. var task: NSURLSessionTask! 
  10.  
  11. init(url: String, method: String, params: Dictionary = Dictionary(), callback: (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void) { 
  12. self.url = url 
  13. self.request = NSMutableURLRequest(URL: NSURL(string: url)!) 
  14. self.method = method 
  15. self.params = params 
  16. self.callback = callback 

之后,將上面分析的

1. 確定 URL

2. 確定 HTTP 方法(GET、POST 等)

3. 添加特定的 HTTP 頭

4. 填充 HTTP Body

前三步封裝到一個 function 中,***一步封裝到一個 function 中,然后把驅動 session.dataTaskWithRequest 的代碼封裝到一個 function 中:
 

  1. func buildRequest() { 
  2. if self.method == "GET" && self.params.count > 0 { 
  3. self.request = NSMutableURLRequest(URL: NSURL(string: url + "?" + buildParams(self.params))!) 
  4.  
  5. request.HTTPMethod = self.method 
  6.  
  7. if self.params.count > 0 { 
  8. request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type"
  9. func buildBody() { 
  10. if self.params.count > 0 && self.method != "GET" { 
  11. request.HTTPBody = buildParams(self.params).nsdata 
  12. func fireTask() { 
  13. task = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in 
  14. self.callback(data: data, response: response, error: error) 
  15. }) 
  16. task.resume() 

之后使用一個統(tǒng)一的方法來驅動上面三個 function,完成請求:

  1. func fire() { 
  2. buildRequest() 
  3. buildBody() 
  4. fireTask() 

同時,不要忘了那三個 parse params 的從 Alamofire 偷來的函數哦,也要放到這個類里面。至此,降低耦合的工作基本完成,接下來我們開始封裝“網絡API”。

使用適配器模式封裝“網絡API”

理解適配器模式

適配器模式是設計模式中的一種,很容易理解:我的 APP 需要一個獲取某一個 URL 返回的字符串的功能,我現在選擇的是 Alamofire,但是正在發(fā)展的 Pitaya 看起來不錯,我以后想替換成 Pitaya,所以我封裝了一層我自己的網絡接口,用來屏蔽底層細節(jié),到時候只需要修改這個類,不需要再深入項目中改那么多接口調用了。

適配器模式聽起來高大上,其實這是我們在日常編碼中非常常用的設計模式。

Do it!

修改 Network 類的代碼為:

  1. class Network{ 
  2. static func request(method: String, url: String, params: Dictionary = Dictionary(), callback: (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void) { 
  3. let manager = NetworkManager(url: url, method: method, params: params, callback: callback) 
  4. manager.fire() 

搞定!

封裝多級接口

不帶 params 的接口:

  1. static func request(method: String, url: String, callback: (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void) { 
  2. let manager = NetworkManager(url: url, method: method, callback: callback) 
  3. manager.fire() 

兩個 get 接口(帶與不帶 params):
 

  1. static func get(url: String, callback: (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void) { 
  2. let manager = NetworkManager(url: url, method: "GET", callback: callback) 
  3. manager.fire() 
  4. static func get(url: String, params: Dictionary, callback: (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void) { 
  5. let manager = NetworkManager(url: url, method: "GET", params: params, callback: callback) 
  6. manager.fire() 

兩個 post 接口(帶與不帶 params):
 

  1. static func post(url: String, callback: (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void) { 
  2. let manager = NetworkManager(url: url, method: "POST", callback: callback) 
  3. manager.fire() 
  4. static func post(url: String, params: Dictionary, callback: (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void) { 
  5. let manager = NetworkManager(url: url, method: "POST", params: params, callback: callback) 
  6. manager.fire() 

測試接口

修改 ViewController 中的調用代碼,測試多級 API:
 

  1. @IBAction func mainButtonBeTapped(sender: AnyObject) { 
  2. let url = "http://pitayaswift.sinaapp.com/pitaya.php" 
  3.  
  4. Network.post(url, callback: { (data, response, error) -> Void in 
  5. println("POST 1 請求成功"
  6. }) 
  7. Network.post(url, params: ["post""POST Network"], callback: { (data, response, error) -> Void in 
  8. let string = NSString(data: data, encoding: NSUTF8StringEncoding) as! String 
  9. println("POST 2 請求成功 " + string) 
  10. }) 
  11.  
  12. Network.get(url, callback: { (data, response, error) -> Void in 
  13. println("GET 1 請求成功"
  14. }) 
  15. Network.get(url, params: ["get""POST Network"], callback: { (data, response, error) -> Void in 
  16. let string = NSString(data: data, encoding: NSUTF8StringEncoding) as! String 
  17. println("GET 2 請求成功 " + string) 
  18. }) 
  19.  
  20. Network.request("GET", url: url, params: ["get""Request Network"]) { (data, response, error) -> Void in 
  21. let string = NSString(data: data, encoding: NSUTF8StringEncoding) as! String 
  22. println("Request 請求成功 " + string) 

運行項目,點擊按鈕,查看效果:

 

多級 API 封裝成功!
 

責任編輯:chenqingxiang 來源: 呂文翰_JohnLui 的博客
相關推薦

2015-06-02 09:51:40

iOS網絡請求封裝接口

2015-06-02 09:41:00

iOS網絡請求NSURLSessio

2017-03-02 13:31:02

監(jiān)控系統(tǒng)

2023-12-16 13:21:00

Python元類ORM

2024-12-06 09:58:09

2020-09-29 12:13:46

SQL引擎底層

2017-02-14 10:20:43

Java Class解析器

2015-07-23 14:53:50

貝葉斯分類器

2014-11-26 10:54:20

C#

2021-02-22 17:17:38

Proxy緩存代碼

2023-12-15 10:14:42

數據庫select語句

2021-07-04 10:07:04

Virtual DO閱讀源碼虛擬DOM

2018-04-08 11:20:43

深度學習

2024-03-08 12:45:00

C#Web服務器

2018-02-07 10:46:20

數據存儲

2018-09-12 10:58:11

NBA數據存儲

2022-08-29 14:22:03

bpmn.jsVue流程

2021-04-26 07:31:22

SpringMVCweb框架

2012-07-30 09:40:52

Lua

2022-03-09 09:43:01

工具類線程項目
點贊
收藏

51CTO技術棧公眾號

91亚洲天堂| 668精品在线视频| 久久精品一区中文字幕| 亚洲色成人一区二区三区小说| 国产一区二区三区四区五区| 欧美视频裸体精品| 男人添女人下部高潮视频在观看| 91精品国产成人观看| 欧美中在线观看| 欧美成人aa大片| 国产福利久久| 国产区一区二| 欧美成人乱码一区二区三区| 男女曰b免费视频| 美国av一区二区| 国产成人一区二区三区电影| 欧美xo影院| 亚洲成色777777在线观看影院| 色播在线视频| 亚洲午夜电影网| 国产成人一区二区三区别| 琪琪一区二区三区| 成人在线国产精品| 不卡日本视频| 欧美一区二区三区免费观看| 亚洲自拍的二区三区| 国产iv一区二区三区| 91精品国产毛片武则天| 美女视频黄a大片欧美| 国产精品成人一区二区三区吃奶 | 不卡视频一二三四| 一区二区三区三区在线| 麻豆免费看一区二区三区| 黄色一级片国产| 亚洲一区在线电影| 一级毛片免费看| 精品久久久久国产| 中文资源在线网| 欧美xxx久久| 26uuu亚洲电影在线观看| 国产视频精品一区二区三区| 日韩在线精品强乱中文字幕| 国产不卡视频在线| 美日韩一级片在线观看| 黄色网址在线免费看| 久久久精品黄色| www午夜视频| 欧美日韩亚洲综合在线| 国产综合色区在线观看| 97热在线精品视频在线观看| 国产欧美亚洲一区| 天堂av免费看| 依依成人综合视频| 欧美成人三区| 秋霞成人午夜鲁丝一区二区三区| 国内精品自线一区二区三区视频| 国产高潮免费视频| 亚洲福利视频专区| 久久99国内| 大西瓜av在线| 69久久夜色精品国产69蝌蚪网| 成年永久一区二区三区免费视频 | 激情五月综合网| 欧美这里只有精品| 亚洲美女精品一区| 国产精品亚洲成在人线| 成人免费在线视频网站| av午夜精品一区二区三区| 日日夜夜天天综合入口| 久久精品综合网| 爱情电影社保片一区| 国产精品自产拍在线观看| 久久影院电视剧免费观看| 一区一区三区| 一区二区精品视频| 精品日韩av一区二区| 成人免费在线播放| 男女性激情视频在线观看| 欧美变态tickle挠乳网站| 红桃视频欧美| 久久香蕉av| 六十路精品视频| 欧美mv日韩mv亚洲| 欧美日韩福利| 美女写真理伦片在线看| 免费成人进口网站| 亚洲国产97在线精品一区| 日韩av不卡在线观看| 国产成人l区| 在线观看成人av电影| 国产亚洲精品久久久久久777| 国产成人在线免费观看| 色诱色偷偷久久综合| 欧美三级午夜理伦三级老人| 色综久久综合桃花网| 成人av网站在线观看免费| 欧美经典影片视频网站| 欧美日韩在线中文字幕| 国产一区二区三区无遮挡| 精品少妇一区二区三区在线视频| 一本久道久久综合狠狠爱| 欧美电影免费观看网站| 成人福利视频导航| 国产在线播放一区二区| 在线观看精品自拍私拍| 国产剧情一区二区| 欧洲杯足球赛直播| 成人免费图片免费观看| 4kfree性满足欧美hd18| 日韩中文字幕一区| 色噜噜国产精品视频一区二区| 亚洲人成亚洲人成在线观看图片| 麻豆国产欧美一区二区三区| 亚洲日本va| а√天堂8资源在线| jizzjizz中文| 日韩精品一区在线视频| 91欧美激情另类亚洲| 精品久久久网站| 精品国产鲁一鲁一区二区张丽| 蜜桃视频免费观看一区| 亚洲久久久久| 欧美一区二区三区高清视频| 亚洲第一图区| 国产无套粉嫩白浆在线2022年 | 99久久久久| 性欧美videohd高精| 精品99又大又爽又硬少妇毛片| 午夜电影福利网| 草草久久久无码国产专区| 亚洲国产一区二区三区在线播| 国产精品久久9| 97免费中文视频在线观看| 久久97精品久久久久久久不卡 | 亚洲最大网站| 欧亚一区二区| 国产xxxxx| 亚洲香蕉成人av网站在线观看 | 久久久久久久国产精品影院| 国产一区欧美一区| 亚洲一区亚洲二区| 精品欧美乱码久久久久久1区2区| 午夜国产精品视频| 久久久久久女乱国产| 精品一区2区三区| 精品免费国产| 韩国福利视频一区| 在线亚洲男人天堂| 日韩精品一区二区三区老鸭窝| 一区二区三区久久久| 狠狠色狠狠色综合日日小说| 国产欧美日韩另类一区| 亚洲乱码日产精品bd| 成人午夜电影小说| 日韩影院精彩在线| 国产99久久精品一区二区300| 阿v免费在线观看| 曰韩少妇与小伙激情| 久操手机在线视频| 日本中文字幕久久看| 精品裸体舞一区二区三区| 99精品视频在线免费观看| 亚洲一级在线| 欧美精选在线| 国内精品久久久久国产盗摄免费观看完整版| 阿v免费在线观看| 米奇777在线影院线| 欧美亚洲一级二级| 久久男人的天堂| 亚洲欧美精品一区二区| 日韩视频永久免费| 日韩一级完整毛片| 欧美午夜不卡在线观看免费| 91丝袜美腿高跟国产极品老师| 石原莉奈一区二区三区在线观看| 国产成人av一区二区三区在线 | 国产一区二区三区18| 不卡在线视频中文字幕| 国产精品伦理久久久久久| 91久久精品无嫩草影院| 午夜影院免费播放| 啊啊啊国产视频| 黄色免费在线网站| 精品9999| 色婷婷狠狠综合| 国产亚洲精品久久久久久777 | 日韩欧美卡一卡二| 欧美激情第6页| caoporen国产精品| 在线精品日韩| 500福利第一精品导航| 日韩激情电影免费看| 亚洲自拍电影| 亚洲九九爱视频| 久久久久中文字幕| 国产免费毛卡片| 亚洲另类春色校园小说| 亚洲一区二区三区免费视频| 精品国产亚洲在线| 好吊色欧美一区二区三区视频 |