前段時間發(fā)一篇博客,里面講到了OC中封裝網(wǎng)絡(luò)中間層的作用,和具體實現(xiàn)代碼。在swift中也可以封裝網(wǎng)絡(luò)中間層,然后再通過網(wǎng)絡(luò)中間層來請求網(wǎng)絡(luò)數(shù)據(jù)。封裝網(wǎng)絡(luò)多線程的好處是我們能夠很方便地將中間使用的網(wǎng)絡(luò)請求框架進(jìn)行替換。具體原理像下面兩張圖片那樣。

1.png

如果使用第一張圖片顯示的那種方式請求數(shù)據(jù),每一個ViewController都通過AFN來請求數(shù)據(jù),我們替換數(shù)據(jù)的請求框架的時候需要將每個使用AFN框架的代碼進(jìn)行修改。如果我們使用一個網(wǎng)絡(luò)中間層 進(jìn)行封裝。替換框架的時候只需要修改中間的AFN。之前發(fā)的一篇博客對于封裝網(wǎng)絡(luò)多線程的方式有更詳細(xì)的說明。如果對于網(wǎng)絡(luò)中間層的好處還沒看懂,建議前往觀看那篇博客。博客地址iOS開發(fā)--OC網(wǎng)絡(luò)請求中網(wǎng)絡(luò)中間層的使用。
實現(xiàn)封裝網(wǎng)絡(luò)中間層,需要封裝一個網(wǎng)絡(luò)請求數(shù)據(jù)的方法,在方法中再使用具體的框架進(jìn)行網(wǎng)絡(luò)請求。而網(wǎng)絡(luò)請求需要的參數(shù)就通過方法的參數(shù)傳遞進(jìn)去。這個網(wǎng)絡(luò)請求的方法,是上面圖片中的網(wǎng)絡(luò)請求工具。
封裝網(wǎng)絡(luò)請求時我們先自定義一個處理網(wǎng)絡(luò)請求的工具類SwiftNetWorkTool,該工具類繼承自AFHTTPSessionManager。然后在該類中定義網(wǎng)絡(luò)請求的方法。
import UIKit
class SwiftNetWorkTool: AFHTTPSessionManager {
//創(chuàng)建一個單例
static let shareTool = SwiftNetWorkTool()
// get請求和post請求
func request(urlstr : String, method : String, parameters : [String : AnyObject]?, callBack : (AnyObject?) -> ()) {
//定義請求數(shù)據(jù)成功后用于返回數(shù)據(jù)的閉包,這是一個尾隨閉包
let success = {
//參數(shù)用小括號包起來
(task: NSURLSessionDataTask, responseObject: AnyObject?) -> Void in callBack(responseObject)
}
//定義請求數(shù)據(jù)失敗后用于返回失敗信息的閉包,同樣也是一個尾隨閉包
let failure = {
(task : NSURLSessionDataTask?, error : NSError) -> Void in
print(error)
callBack(nil)
}
//判斷是GET方法,還是POST方法,再調(diào)用對應(yīng)的方法,并將需要返回的數(shù)據(jù)通過閉包進(jìn)行返回
if method == "GET" {
//解決bug時照著提示進(jìn)行操作
self.GET(urlstr, parameters: parameters, progress: nil, success: success, failure: failure)
}
if method == "POST" {
self.POST(urlstr, parameters: parameters, progress: nil, success: success, failure: failure)
}
}
}
接下來我們在SwiftViewController中調(diào)用該方法進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)請求
import UIKit
class SwiftViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//調(diào)用加載數(shù)據(jù)的方法
loadData()
}
func loadData(){
SwiftNetWorkTool.shareTool.GET("https://httpbin.org/get?name=xiaoming", parameters: ["age":20], progress: nil, success: { ( task, responseObject) in
print(responseObject)
}) { (task ,error) in
print(error)
}
}
func loadData2(){
SwiftNetWorkTool.shareTool.POST("https://httpbin.org/get?name=xiaoming", parameters: ["age" : 20], progress: nil, success: { (task, responseObject) in
print(responseObject)
}) { (task , error) in
print(error)
}
}
}
上面內(nèi)容是封裝網(wǎng)絡(luò)中間的做法,我們封裝了swift中的網(wǎng)絡(luò)中間層,這個中間層可以在OC方面使用,我們先把我們創(chuàng)建的swift文件拉入到OC項目文件中,把swift文件拉入OC文件的時候,會彈出下面一個窗口。點擊最右邊的按鈕,創(chuàng)建一個橋鏈接,xCode會自動幫我們創(chuàng)建一個橋接文件。

4.png
如果你還需要自定義橋接文件,就在這里進(jìn)行設(shè)置。

6.png
在OC調(diào)用swift方法之前,我們還要再做下面的設(shè)置。

做了上面設(shè)置后我們就能在OC中調(diào)用swift方法了。
項目文件已經(jīng)上傳到git,點擊下面鏈接可以下載。demo地址