2014-06-05 11 views
12

Sto cercando di ottenere una risposta JSON utilizzando Swift.AFNetworking and Swift

Ho annusato la richiesta e la risposta -> tutto ok. Tuttavia, il valore restituito è sempre 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) 

Ho anche provato in questo modo:

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

... Ma la responseObject sembra sempre di essere nil

EDIT:

Forse il motivo è la possibile inizializzazione errata nel mio 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 
} 

Qualche suggerimento su cosa sto facendo male?

+1

consiglio vivamente di usare [Alamofire] (https://github.com/Alamofire/Alamofire) invece di AFNetworking. È il successore di AFNetworking completamente riscritto in e per Swift. – Dschee

risposta

8

Swift è completamente compatibile con il codice Objective-C, quindi il tuo problema è non collegato a Swift stesso. In AFNetworking, lo responseObjectpuò essere a volte nil. Questo comprende i casi in cui:

  • è stato restituito un codice di stato 204 No Content,
  • Se flusso di uscita è stata impostata per scrivere sul file,
  • Se l'errore durante la convalida non è stato NSURLErrorCannotDecodeContentData (ad esempio, il tipo di contenuto inaccettabile)

Verificare #740 e #1280 per ulteriori informazioni.

+0

Grazie per il suggerimento ... sembra che la mia inizializzazione di base sia sbagliata. Non ho ancora capito perché. Aggiungo le informazioni al mio post originale – user707342

+1

Si tratta di un problema relativo al server -> Ho provato un altro URL e ha funzionato. Grazie! – user707342

6

È possibile utilizzare l'interoperabilità di Swift con i framework Objective-C, ma ora c'è una libreria ufficiale là fuori, diamo un'occhiata fuori:

https://github.com/Alamofire/Alamofire

Questa libreria è scritta in nativo Swift, dal creatore di AFNetworking. Probabilmente vorrai cercare questo genere di cose quando ti trasferirai a Swift. L'ho provato ed è fantastico, come il suo predecessore.

-1
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() 
    } 
}