AFNetworking y Swift

Estoy intentando get una respuesta JSON usando Swift.

Hojeé la request y la respuesta -> todo está bien. Sin embargo, el valor de retorno es siempre 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) 

También lo probé de esta manera:

 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") }) 

… Pero el responseObject siempre parece ser nil

EDITAR:

Tal vez la razón sea la posible initialization incorrecta en mi AppDelegate :

 var httpRequestOperationManager: AFHTTPRequestOperationManager? // JAVA SERVER Client class func appDelegate() -> AppDelegate { return UIApplication.shanetworkingApplication().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.shanetworkingManager().enabled = true // ##### HTTP ##### let baseURL = NSURL(string: "http://data.wien.gv.at"); httpRequestOperationManager = AFHTTPRequestOperationManager(baseURL: baseURL)) httpRequestOperationManager!.requestSerializer = requestSerializer httpRequestOperationManager!.responseSerializer = responseSerializer } 

¿Alguna sugerencia de lo que estoy haciendo mal?

Swift es totalmente compatible con el código Objective-C, por lo que su problema no está conectado con Swift. En AFNetworking , el responseObject veces puede ser nil . Esto incluye casos, donde:

  • Se devolvió un código de estado A 204 No Content ,
  • Si la secuencia de salida se configuró para escribir en el file,
  • Si el error durante la validation no fue NSURLErrorCannotDecodeContentData (por ejemplo, tipo de contenido inaceptable)

Consulte # 740 y # 1280 para get más información.

Puede usar la interoperabilidad de Swift con los frameworks de Objective-C, pero ahora hay una biblioteca oficial, verifique:

https://github.com/Alamofire/Alamofire

Esta biblioteca está escrita en Swift nativo, del creador de AFNetworking. Probablemente querrás search este tipo de cosas cuando te mudas a Swift. Lo probé y es increíble, como su pnetworkingecesor.

 HttpManager.shanetworkingInstance.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 shanetworkingInstance: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() } }