2014-06-05 6 views
12

Ich versuche, eine JSON-Antwort mit Swift zu bekommen.AFNetworking and Swift

Ich schnüffelte die Anfrage und Antwort -> alles in Ordnung. Der Rückgabewert ist jedoch immer 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) 

Ich versuchte es auch auf diese Weise:

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

... Aber die responseObject scheint immer nil

EDIT zu sein:

Vielleicht ist der Grund, die möglich falsche Initialisierung in meinem 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 
} 

Irgendwelche Vorschläge, was ich falsch mache?

+1

empfehle ich Ihnen, verwenden Sie [Alamofire] (https://github.com/Alamofire/Alamofire) statt AFNetworking. Es ist der Nachfolger von AFNetworking, komplett neu geschrieben in und für Swift. – Dschee

Antwort

8

Swift ist voll kompatibel mit Objective-C-Code, so ist Ihr Problem nicht mit Swift selbst verbunden. In AFNetworking kann die responseObject manchmal nil sein. Dies gilt auch für Fälle, in denen:

  • Ein 204 No Content Statuscode zurückgegeben wurde,
  • Wenn Ausgabestream-Datei wurde auf schreiben,
  • Wenn der Fehler bei der Validierung nicht NSURLErrorCannotDecodeContentData ist (zB nicht akzeptabel Inhaltstyp)

Weitere Informationen finden Sie unter #740 und #1280.

+0

Danke für den Hinweis ... es scheint, dass meine grundlegende Initialisierung falsch ist. Ich habe noch nicht herausgefunden, warum. Ich füge die Informationen zu meinem ursprünglichen Beitrag – user707342

+1

Es ist ein Server-Problem -> Ich habe versucht, eine andere URL und es hat funktioniert. Vielen Dank! – user707342

6

Sie können Swifts Interoperabilität mit Objective-C-Frameworks verwenden, aber jetzt gibt es eine offizielle Bibliothek gibt, lassen Sie uns, check it out:

https://github.com/Alamofire/Alamofire

Diese Bibliothek in nativer Swift geschrieben, von dem Schöpfer AFNetworking. Wahrscheinlich werden Sie nach solchen Dingen suchen, wenn Sie zu Swift wechseln. Ich habe es ausprobiert und es ist großartig, wie sein Vorgänger.

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