IOS開發: 在Swift中使用AFNetworking
今天主要簡單說一下如何在Swift工程中使用時下比較流行的AFNetworking請求架構。
由於目前AFNetworking目前還沒有Swift版本,因此我們的工程使用cocoapod來安裝AFNetworking。
這是我的Prodfile檔案,cocoapod的使用方法跟使用OC是時候是一模一樣的,為了方便,我們在工程中隨便建立一個類,選擇語言OC,我們會發現工程中會多出來一個SwiftStudy-Bridging-Header.h檔案,刪除建立的oc類,在這裡引入
好了,可以在swift檔案使用AFNetworking
- platform :ios, '7.0'
- pod 'SDWebImage', '~> 3.7.1'
- pod 'CocoaHTTPServer', '~> 2.3'
- pod 'RoutingHTTPServer', '~> 1.0.0'
- pod 'Masonry', '~> 0.6.1'
- pod 'ASIHTTPRequest', '~> 1.8.2'
- pod 'MBProgressHUD', '~> 0.9.1'
- pod 'AFNetworking', '~> 2.5.4'
在使用OC進行項目開發時,對AFNetworking做了一層簡單的外部封裝,今天我們就把它用Swift實現。
使用過新版AFNetworking的都知道它有一個AFHTTPSessionManager,在這裡我們繼承AFHTTPSessionManager使用單例模式返回一個該類的執行個體,
來進行網路操作在swift中單例的寫法跟OC文法差別很大,Swift文法在這裡不多講解,請參考《The Swift Programming Language》,我們來看下代碼
- //
- // RequestClient.swift
- // SwiftStudy
- //
- // Created by 楊雯德 on 15/8/19.
- // Copyright (c) 2015年 楊雯德. All rights reserved.
- //
- import UIKit
- class RequestClient: AFHTTPSessionManager {
-
- class var sharedInstance :RequestClient {
- struct Static {
- static var onceToken:dispatch_once_t = 0
- static var instance:RequestClient? = nil
- }
-
- dispatch_once(&Static.onceToken, { () -> Void in
- //string填寫相應的baseUrl即可
- var url:NSURL = NSURL(string: "")!
- Static.instance = RequestClient(baseURL: url)
- })
- //返回本類的一個執行個體
- return Static.instance!
-
- }
- }
拿到RequestClient的執行個體我們就可以進行post、get以及上傳圖片檔案的封裝了
在OC中使用AFNetworking習慣使用block來進行資料的傳遞等,在Swift我們使用閉包來進行資料的傳輸
這是我的檔案目錄
SwiftStudy ------------工程目錄
AppDelegate.swift
myViewController.swift
ViewController.swift
NetWork ------------網路相關
RequestClient.swift
RequestAPI.swift
CustomVC ------------VC的封裝,
CostomNavigationVC.swift
BaseViewController.swift
在這裡我們主要拿中國天氣網的API測試一個PUT請求,來看下RequestAPI.swift。
- override func viewDidLoad() {
- super.viewDidLoad()
-
- self.view.backgroundColor = UIColor.brownColor()
- var image:UIImage
- //Navigationbar 左側返回按鈕自訂,參考檔案BaseViewController.swift
- self.leftButton(nil, hlIimage: nil, title: "返回", size: CGSize(width: 38, height: 30), action: "buttonClick", target: self)
-
- var dic:Dictionary= ["A":"a","B":"b","C":"c"];
-
-
- //post測試
- RequestAPI.POST("List", body: dic, succeed: succeed, failed:failed)
- //get測試
- var getUrl:String = "http://m.weather.com.cn/atad/101190101.html"
- RequestAPI.GET(getUrl, body: nil, succeed: succeed, failed: failed)
-
- //檔案上傳
- // Do any additional setup after loading the view.
- }
- func succeed(task:NSURLSessionDataTask!,responseObject:AnyObject!)->Void{
- println("oh my god 成功了+\(responseObject)")
- }
-
- func failed(task:NSURLSessionDataTask!,error:NSError!)->Void{
- println("oh shit 失敗了")
- }
在ViewController我們通過調用RequestAPI的類方法GET來擷取資料,同時我們定義了兩個方法succeed和failed,注意看方法中得參數和AFHTTPSessionManager
返回資料的參數是一樣的,這樣我們的拿到的資料就是伺服器給我們返回的全部資料,調用equestAPI的GET方法將講個函數指標傳遞過去,網路請求成功之後會通過函數指標將資料返回。
然後我們就可以進行其他的工作了。
使用過新版AFNetworking會經常遇到3084 1011和1016錯誤,出現這幾個錯誤一般是資料解析錯誤,更改AFNetworking裡面相應的資料類型即可,也可以根據實際情況自己定義。
- /**
- RequestClient.sharedInstance.requestSerializer = AFJSONRequestSerializer()
- RequestClient.sharedInstance.responseSerializer = AFJSONResponseSerializer()
- RequestClient.sharedInstance.requestSerializer.setValue("application/json,text/html", forHTTPHeaderField: "Accept")
- RequestClient.sharedInstance.requestSerializer.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
- */
總結,AFNetworking已經是用的最多的網路的架構,對AFNetworking的進一步的簡單外層封裝,我們就可以避免網路請求時大量初始化工作,直接使用單例即可,這樣提高了
效率,也節省了大量的代碼,至少一眼望去自己看的也比較舒服,通過使用Swift來封裝AFNetworking,也系統的熟悉一下swift的基本文法,資料類型,以及單例,閉包等得使用,
對應swift初學者來說,實際學習效果還是比較明顯的,有了這些現在你就可以使用swift來寫一個簡單的糗百或者新聞了,還等什麼那,只要自己往前沖,就不會再最後。