成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

移動開發 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() 

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

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

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

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

理解適配器模式

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

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

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

監控系統

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#

2023-12-15 10:14:42

數據庫select語句

2021-02-22 17:17:38

Proxy緩存代碼

2021-07-04 10:07:04

Virtual DO閱讀源碼虛擬DOM

2018-04-08 11:20:43

深度學習

2024-03-08 12:45:00

C#Web服務器

2018-09-12 10:58:11

NBA數據存儲

2018-02-07 10:46:20

數據存儲

2021-04-26 07:31:22

SpringMVCweb框架

2022-08-29 14:22:03

bpmn.jsVue流程

2012-07-30 09:40:52

Lua

2021-08-21 15:40:24

CPU計算機電子領域
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久精品中文字幕 | 日本成人久久 | 在线欧美小视频 | 久久久久久久久国产 | 欧美日韩国产精品一区二区 | 欧美一区二区三区免费电影 | 成人精品久久 | 精品国产一区二区三区免费 | 亚洲综合三区 | 亚洲精品综合 | 91麻豆精品国产91久久久更新资源速度超快 | 人人叉| 久久久欧洲 | h在线免费观看 | 色综合久| 精品国产91 | 中文字幕精品视频 | www天天操| 成人精品视频在线观看 | 久久人人爽人人爽人人片av免费 | 午夜男人视频 | 一区二区在线不卡 | 韩日一区二区三区 | 男女羞羞在线观看 | 成人欧美一区二区三区在线观看 | 九九久久久 | 久久欧美精品 | 国产亚洲精品精品国产亚洲综合 | 日韩图区 | 国产精品久久久亚洲 | 国产精品国产成人国产三级 | 色综合色综合色综合 | 91精品国产91 | 欧美一区二区三区在线 | 午夜精品久久久久久不卡欧美一级 | 亚洲欧美激情精品一区二区 | 中文字幕精品一区 | 国产专区免费 | 国产亚洲精品久久19p | 欧美中文字幕一区二区三区亚洲 | 色精品视频|