日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
自己動(dòng)手寫一個(gè)iOS網(wǎng)絡(luò)請求庫——降低耦合

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

創(chuàng)新互聯(lián)專注于紫陽企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,商城網(wǎng)站制作。紫陽網(wǎng)站建設(shè)公司,為紫陽等地區(qū)提供建站服務(wù)。全流程按需開發(fā)網(wǎng)站,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

本文中,我們將一起降低之前代碼的耦合度,并使用適配器模式實(shí)現(xiàn)一層獨(dú)立于底層結(jié)構(gòu)的網(wǎng)絡(luò) API,造一個(gè)真正的網(wǎng)絡(luò)請求“庫”。

降低耦合度

如何降低耦合度

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

構(gòu)造 NSURLRequest

確定 URL

確定 HTTP 方法(GET、POST 等)

添加特定的 HTTP 頭

填充 HTTP Body

驅(qū)動(dòng) session.dataTaskWithRequest 方法,開始請求

具體實(shí)施

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

 
 
  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

前三步封裝到一個(gè) function 中,***一步封裝到一個(gè) function 中,然后把驅(qū)動(dòng) session.dataTaskWithRequest 的代碼封裝到一個(gè) 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() 

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

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

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

使用適配器模式封裝“網(wǎng)絡(luò)API”

理解適配器模式

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

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

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

兩個(gè) 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() 

兩個(gè) 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 中的調(diào)用代碼,測試多級 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) 

運(yùn)行項(xiàng)目,點(diǎn)擊按鈕,查看效果:

多級 API 封裝成功!
 


本文標(biāo)題:自己動(dòng)手寫一個(gè)iOS網(wǎng)絡(luò)請求庫——降低耦合
轉(zhuǎn)載來源:http://www.dlmjj.cn/article/dppsocs.html