版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/u010046908/article/details/51588829
下面是我的建立的Swift學習交流群,歡迎大家一起來共同學習Swift。
前面寫了一部分關于Swift的文法學習,今天要學習的是Swift關于iOS中網絡請求的AFNetwoking3.0的封裝。
Swift關于iOS中網絡請求的AFNetwoking3.0的封裝的流程有如下的幾個步驟:
- 使用cocoaPods 下載下傳AFNetwoking的庫
- 建立橋接檔案
- 封裝AFNetwokingUtil工具類
- 使用協定進行傳值
- 案例的實作
1.使用cocoaPods 下載下傳AFNetwoking的庫
platform :ios,'8.0'
use_frameworks!
target 'HelloSwfit' do
pod 'AFNetworking','~> 3.0'
pod 'SwiftyJSON','~> 2.3'
pod 'Toast-Swift', '~> 1.3.0'
end
接着在終端指令執行:pod update –verbose –no-repo-update
這樣下載下傳成功了。
2.建立橋接檔案
1.1在用Swift使用OC中得類檔案的時候,需要進行橋接,首先建一個.h的頭檔案。
注意:橋接檔案的命名規則:項目名-Bridging-Header.Swift
#import "AFNetworking/AFNetworking.h"
1.2 在Build-settings -> Swift Complier - Code Generaton —>Objective C Briding Herder中添加自己的橋接檔案。
如下圖:
這樣的話,橋接檔案已經OK。
3.封裝AFNetwokingUtil工具類
//
// AFNetWorkingUtil.swift
// HelloSwfit
//
// Created by lidong on 16/5/17.
// Copyright © 2016年 lidong. All rights reserved.
//
import UIKit
/// 對AFNetworking的封裝
class AFNetWorkingUtil {
/// 基礎URL
let BASE_URL = "http://v.juhe.cn"
/// AFHTTPSessionManager
let _sessionManager = AFHTTPSessionManager()
/// 定義一個響應結果的傳遞代理
var delegate: ResponseResultDelegate?
// 單例 全局的的網絡工具
class var sharedInstance: AFNetWorkingUtil
{
struct Static {
static var onceToken : dispatch_once_t = 0
static var instance : AFNetWorkingUtil? = nil
}
dispatch_once(&Static.onceToken) {
Static.instance = AFNetWorkingUtil()
}
return Static.instance!
}
/**
擷取baseUrl
- parameter baseUrl: 基礎的url
- returns: URL
*/
func getBaseUrl(baseUrl:String) ->String{
return BASE_URL
}
/**
post請求
- parameter action: 請求的action
- parameter params: 請求參數
*/
func post(action:String,params:Dictionary<String,String>){
_sessionManager.POST(getBaseUrl(BASE_URL)+action, parameters: params, success: { (operation:NSURLSessionDataTask?, responseObj:AnyObject?) in
print(responseObj)
self.delegate?.responseSuccess(responseObj)
}) { (operation:NSURLSessionDataTask? ,error:NSError) in
print(error)
self.delegate?.responseError(error)
}
}
/**
get請求
- parameter action: 請求的action
- parameter params: 請求參數
*/
func get(action:String,params:Dictionary<String,String>){
_sessionManager.GET(getBaseUrl(BASE_URL)+action, parameters: params, success: { (operation:NSURLSessionDataTask?, responseObj:AnyObject?) in
print(responseObj)
self.delegate?.responseSuccess(responseObj)
}) { (operation:NSURLSessionDataTask? ,error:NSError) in
print(error)
self.delegate?.responseError(error)
}
}
}
4.使用協定進行傳值
//
// ResponseResult.swift
// HelloSwfit
//
// Created by lidong on 16/6/5.
// Copyright © 2016年 lidong. All rights reserved.
//
/**
* 網絡請求響應結果的回調
*/
protocol ResponseResultDelegate {
/**
響應成功的回調
- parameter response: 成功的資訊
*/
func responseSuccess(responseObj:AnyObject?)
/**
響應失敗的回調
- parameter responseError: 失敗的資訊
*/
func responseError(responseObj:AnyObject?)
}
5.案例的實作
//
// NetWokingGetDemo.swift
// HelloSwfit
//
// Created by lidong on 16/6/5.
// Copyright © 2016年 lidong. All rights reserved.
//
import Foundation
import SwiftyJSON
class NetWokingGetDemo: UITableViewController,
ResponseResultDelegate {
let aFUtils = AFNetWorkingUtil.sharedInstance
var items:Array = [String]()
override func viewDidLoad() {
super.viewDidLoad()
aFUtils.delegate = self
let action:String = "/dream/category"
let dic = ["key":"c73b082b0c150b3bcba2cea1b96a8922"]
aFUtils.get(action, params: dic)
self.tableView.delegate = self
self.tableView.dataSource = self
self.title = "周公解夢"
}
func responseError(responseObj: AnyObject?) {
Util.log("responseSuccess", message: "伺服器異常!")
}
func responseSuccess(responseObj: AnyObject?) {
let json = JSON(responseObj!)
Util.log("responseSuccess", message: json["error_code"].intValue)
Util.log("responseSuccess", message: json["reason"].string!)
Util.log("responseSuccess", message: json["result"].array!.count)
let d = json["result"].array!.count
if d > 0 {
let list: Array<JSON> = json["result"].array!
for item in list {
items.append(item["name"].string!)
}
self.tableView.reloadData()
}
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
let cell = UITableViewCell()
cell.textLabel?.text = items[indexPath.row]
return cell;
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
Util.showToast(self, message: items[indexPath.row])
}
}
代碼位址: 運作的效果: