2014-06-05 9 views
12

मैं स्विफ्ट का उपयोग कर JSON प्रतिक्रिया प्राप्त करने का प्रयास कर रहा हूं।AFNetworking और स्विफ्ट

मैंने अनुरोध और प्रतिक्रिया को छीन लिया -> सब कुछ ठीक है। हालांकि वापसी मूल्य हमेशा 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 
} 

कोई सुझाव जो मैं गलत कर रहा हूं?

+1

मैं अत्यधिक तुम AFNetworking के बजाय [Alamofire] (https://github.com/Alamofire/Alamofire) का उपयोग करें। यह एफ़नेटवर्किंग का उत्तराधिकारी है और स्विफ्ट के लिए पूरी तरह से लिखा गया है। – Dschee

उत्तर

8

स्विफ्ट उद्देश्य-सी कोड के साथ पूरी तरह से संगत है, इसलिए आपकी समस्या स्विफ्ट से जुड़ा हुआ नहीं है। AFNetworking में, responseObject कभी-कभी nil हो सकता है। इस मामले, जहां में शामिल हैं:

  • एक 204 No Content स्थिति कोड लौटाया गया था,
  • तो उत्पादन धारा फाइल करने के लिए लिखने के लिए स्थापित किया गया था,
  • तो सत्यापन के दौरान त्रुटि NSURLErrorCannotDecodeContentData (जैसे अस्वीकार्य सामग्री प्रकार) नहीं था

अधिक जानकारी के लिए #740 और #1280 देखें।

+0

संकेत के लिए धन्यवाद ... ऐसा लगता है कि मेरा मूल प्रारंभिक गलत है। मुझे अभी तक पता नहीं चला है क्यों। मैं अपनी मूल पोस्ट – user707342

+1

पर जानकारी जोड़ता हूं यह एक सर्वर से संबंधित समस्या है -> मैंने एक अन्य यूआरएल की कोशिश की और यह काम किया। धन्यवाद! – user707342

6

आप ऑब्जेक्टिव-सी चौखटे के साथ स्विफ्ट के अंतर का उपयोग कर सकते है, लेकिन अब वहाँ एक अधिकारी पुस्तकालय वहाँ बाहर है, चलो यह बाहर की जाँच करते हैं:

https://github.com/Alamofire/Alamofire

इस पुस्तकालय देशी स्विफ्ट में लिखा है के निर्माता से, AFNetworking। स्विफ्ट में जाने पर आप शायद इस तरह की चीज देखना चाहेंगे। मैंने इसे आजमाया और यह अपने पूर्ववर्ती की तरह शानदार है।

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