AFNetworking和Swift

我试图得到一个使用Swift的JSON响应。

我嗅探了请求和响应 – >一切正常。 但是,返回值总是nil

 let httpClient = AppDelegate.appDelegate().httpRequestOperationManager as AFHTTPRequestOperationManager; let path = "/daten/wfs"; let query = "?service=WFS&request=GetFeature&version=1.1.0&typeName=ogdwien:AMPELOGD&srsName=EPSG:4326&outputFormat=json".stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding); func successBlock(operation: AFHTTPRequestOperation!, responseObject: AnyObject!) { println("JSON: " + "\(responseObject)") } func errorBlock(operation: AFHTTPRequestOperation!, error:NSError!) { println("Error: " + error.localizedDescription) } let urlString = "\(path)" + "/" + "\(query)" println("urlString: " + httpClient.baseURL.absoluteString + urlString) 

我也尝试过这种方式:

 httpClient.GET(urlString, parameters: nil, success: { (operation: AFHTTPRequestOperation!, responseObject: AnyObject!) -> Void in println("Success") println("JSON: " + "\(responseObject)") }, failure:{ (operation: AFHTTPRequestOperation!, error:NSError!) -> Void in println("Failure") }) 

…但是responseObject总是好像是nil

编辑:

也许原因是我的AppDelegate可能错误的初始化:

 var httpRequestOperationManager: AFHTTPRequestOperationManager? // JAVA SERVER Client class func appDelegate() -> AppDelegate { return UIApplication.sharedApplication().delegate as AppDelegate } func configureWebservice() { let requestSerializer = AFJSONRequestSerializer() requestSerializer.setValue("1234567890", forHTTPHeaderField: "clientId") requestSerializer.setValue("Test", forHTTPHeaderField: "appName") requestSerializer.setValue("1.0.0", forHTTPHeaderField: "appVersion") let responseSerializer = AFJSONResponseSerializer() AFNetworkActivityIndicatorManager.sharedManager().enabled = true // ##### HTTP ##### let baseURL = NSURL(string: "http://data.wien.gv.at"); httpRequestOperationManager = AFHTTPRequestOperationManager(baseURL: baseURL)) httpRequestOperationManager!.requestSerializer = requestSerializer httpRequestOperationManager!.responseSerializer = responseSerializer } 

任何build议我做错了什么?

Swift与Objective-C代码完全兼容,所以你的问题与Swift本身没有联系。 在AFNetworkingresponseObject有时可能是nil 。 这包括以下情况:

  • A 204 No Content状态代码被返回,
  • 如果输出stream设置为写入文件,
  • 如果validation期间的错误不是NSURLErrorCannotDecodeContentData (例如不可接受的内容types)

请查看#740和#1280了解更多信息。

您可以使用Swift与Objective-C框架的互操作性,但现在有一个官方库,让我们来看看:

https://github.com/Alamofire/Alamofire

这个库是用AFNetworking的创build者编写的本地Swift。 移动到Swift时,您可能会想要寻找这样的东西。 我试了一下,和它的前任一样真棒。

 HttpManager.sharedInstance.getNewestAppList("\(self.numberofPhoto)", offset: "0", device_type: "ios",search: self.strSearch, filter: self.strFilter, onCompletion: { (responseObject: NSDictionary?, error: NSError?) -> Void in if error != nil { SwiftLoader.hide() self.showAlertWithMessage("\(error!.localizedFailureReason!)\n\(error!.localizedRecoverySuggestion!)") } else { SwiftLoader.hide() if responseObject!.valueForKey("status") as! NSString as String == "0" { self.showAlertWithMessage(responseObject!.valueForKey("message") as! NSString as String) } else { self.itemsArray = responseObject!.valueForKey("data") as! NSArray print(self.itemsArray.count) self.tableCategoryDetailRef.reloadData() } } }) 

 import Foundation typealias getResponse = (NSDictionary?, NSError?) -> Void class HttpManager: NSObject { var AFManager: AFURLSessionManager? var strUrl: NSString = "url" class var sharedInstance:HttpManager { struct Singleton { static let instance = HttpManager() } return Singleton.instance } // MARK: - Method func getCount(device_type:String, onCompletion: getResponse) -> Void { let post: String = "device_type=\(device_type)" let postData: NSData = post.dataUsingEncoding(NSASCIIStringEncoding, allowLossyConversion: true)! let postLength:NSString = String(postData.length) let configuration: NSURLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration() AFManager = AFURLSessionManager(sessionConfiguration: configuration) let URL: NSURL = NSURL(string: "\(strUrl)/count" as String)! let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: URL) urlRequest.HTTPMethod = "POST" urlRequest.setValue(postLength as String, forHTTPHeaderField: "Content-Length") urlRequest.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") urlRequest.HTTPBody = postData let task = AFManager?.dataTaskWithRequest(urlRequest) { (data, response, error) in if response == nil { SwiftLoader.hide() } else { let responseDict:NSDictionary = response as! NSDictionary onCompletion(responseDict,error) } } task!.resume() } }