標籤:swift網路請求 swift調用afnetworking swift與oc混編 swift json解析 afnetworking請求失敗
如何使用Swift進行網路請求呢?
我們首先建立一個Swift工程,工程名是SwiftDemo
然後在該工程中建立一個 Oc的類,那麼Xcode會詢問你是否建立 橋接 Oc和 Swift的 SwiftDemo-Bridging-Header.h檔案
選擇YES就會產生 工程名-Bridging-Header.h檔案,在這個檔案中我們引入Oc架構對應的標頭檔即可實現在Swift工程中調用Oc代碼
目前的AFNetworking架構是Oc寫的,我們要在Swift使用AF的話,則需要在 Bridging-Header.h檔案中匯入 "AFNetworking.h"即可
效果如下:
最簡單的AF Get請求
//// AFRequestTest.swift// SwiftDemo//// Created by MBinYang on 15/4/9.// Copyright (c) 2015年 cc.huanyouwang. All rights reserved.//import UIKitclass AFRequestTest: NSObject { func afRequestTest() { var paramDict = ["access_token":"2.00HZE3aF0GvJSM551ca8e0920NF13N","uid":"5117873025"] var afManager = AFHTTPRequestOperationManager() var op = afManager.GET("http://lovemyqq.sinaapp.com/getState.php", parameters:paramDict, success: { (operation: AFHTTPRequestOperation!, responseObject: AnyObject!) in var arr: AnyObject! = NSJSONSerialization.JSONObjectWithData(responseObject as NSData, options: NSJSONReadingOptions.AllowFragments, error: nil) //列印數組或者字典元素 println(arr!) //避免強引用迴圈 unowned var unSelf:AFRequestTest = self //self.xxx //操作 }, failure: { (operation: AFHTTPRequestOperation!, error: NSError!) in println("請求錯誤Error: " + error.localizedDescription) unowned var unSelf:AFRequestTest = self //self.xxx操作 //錯誤的相關操作 }) op.responseSerializer = AFHTTPResponseSerializer() op.start() } }
調用網路請求,在一個 ViewController的 ViewDidLoad中調用來測試
override func viewDidLoad() { super.viewDidLoad() AFRequestTest().afRequestTest() }
輸出:
{ result = ( { state = { address = "\U4e2d\U56fd\U5317\U4eac\U5e02\U671d\U9633\U533a\U5efa\U5916\U8857\U9053\U5efa\U56fd\U8def100\U53f7"; content = "\U4f60\U662f"; date = "2015-01-07 19:06:13"; fromUid = 5117873025; id = 6664; image = "http://xuyingtest-xuyingttt.stor.sinaapp.com/1420628745userImage.png"; imagecount = 1; latitude = "39.907007"; longitude = "116.470241"; }; }, { state = { address = "\U4e2d\U56fd\U5317\U4eac\U5e02\U77f3\U666f\U5c71\U533a\U53e4\U57ce\U8857\U9053"; content = "\U516c\U79ef\U91d1"; date = "2014-11-23 11:10:57"; fromUid = 5117873025; id = 5593; image = "http://xuyingtest-xuyingttt.stor.sinaapp.com/1416712253userImage.png"; imagecount = 1; latitude = "39.897711"; longitude = "116.184322"; }; }, { state = { address = ""; content = Chen; date = "2014-11-21 11:02:19"; fromUid = 5117873025; id = 5551; image = "http://xuyingtest-xuyingttt.stor.sinaapp.com/1416538936userImage.png"; imagecount = 1; latitude = ""; longitude = ""; }; } ); success = 0;}
注意事項和說明:
1.Swift和Oc調用方法的形式不同,Oc是空格, Swift是點號
2.Swift 網路請求的閉包和 Oc寫法不太一樣詳見
Swift教程15-閉包block多種應用方式
Swift教程14-func函數,函數類型_對比Oc
3.避免強引用迴圈的語句
unowned var unSelf:AFRequestTest = self
無主引用,不會增加引用計數;不能為nil
或者
weak var self2:AFRequestTest! = self
弱引用,也不會增加引用計數;但返回的是可選類型,可以為nil
4.類型轉換,向下轉型
responseObject asNSData
向下類型轉換,使用 as 或者 as? ;
區別是 as?轉換失敗會返回nil;成功會返回可選類型
5.構造器和Java/C++等類似
AFRequestTest().afRequestTest()
Swift的構造器相當於 Oc的 alloc init的合體,是用來初始化的.
不過 Swift的構造器是 init()其他語言的是 類名
關於Swift構造器和其他物件導向文章,後續文章會陸續登陸
6.不使用AF的JSON解析
op.responseSerializer = AFHTTPResponseSerializer()
AFNetwoking的JSON解析對於某些介面可能會解析失敗,導致 錯誤輸出
Error: Request failed: unacceptable content-type: text/html
這時我們只要加上面的代碼,即可不讓 AF幫我們解析;而使用系統的內建的JSON解析
7.Post請求類似,上述代碼提供了一個測試的介面
Swift系列教程:http://blog.csdn.net/yangbingbinga/article/category/3050845
Swift教程16-使用Swift調用AFNetworking進行網路請求