2015-05-21 3 views
1

Я пытаюсь получить значения из ответа JSON в ниже формат, но я получаю сообщение об ошибке на Alamofire.request:Кастинг JSON для NSData в Alamofire

не может ссылаться на «responseJSON» со списком аргументов типа '((,, ,) ->)'

Я уверен, что он должен сделать что-то с переменным инициированным перед тем Alamofire.request(). Также я уверен, что возвращение будет nil, как я могу это исправить?

func annotations() -> [TestAnnotation] { 
    var annotations: [TestAnnotation] = [] 
    var points: NSDictionary = [:] 
    var json: NSData? 

    Alamofire.request(.GET, "http://192.168.0.10/test/globe.php", parameters:nil, encoding: .JSON) .responseJSON 
     { 
      (request, response, data, error) in 

      json = JSON((data as? NSData)!) 

    } 
    for point in json["glimps"] as! NSArray { 
     let lat = (point as! NSDictionary)["latitude"] as! CLLocationDegrees 
     let lon = (point as! NSDictionary)["longitude"] as! CLLocationDegrees 
     let gid = String(stringInterpolationSegment: (point as! NSDictionary)["id"]) 
     /// 
     let coordinate1 : CLLocationCoordinate2D = CLLocationCoordinate2DMake(lat, lon) 

     let a1: TestAnnotation = TestAnnotation(coordinate: coordinate1, title: gid) 
     annotations.append(a1) 
    } 

    return annotations 
} 

ответ

1

Это способ, которым я обрабатывать запросы JSON с помощью Alamofire, почему это проблема Я тоже с просьбой Alamofire для JSON тоже:

Alamofire.request(.GET, urlTo, parameters: nil, encoding: .URL).responseString(completionHandler: { 
    (request: NSURLRequest, response: NSHTTPURLResponse?, responseBody: String?, error: NSError?) -> Void in 

    // Convert the response to NSData to handle with SwiftyJSON 
    if let data = (responseBody as NSString).dataUsingEncoding(NSUTF8StringEncoding) { 
     let json = JSON(data: data) 
     println(json) 
    } 
}) 

Но в соответствии с вами Ваш вопрос есть проблема, потому что запрос async это помнит. Это означает, что ваш код в for не работает должным образом, потому что это как раз под запрос, вы можете обработать запрос следующим образом, если вы хотите или просто внутри обработчика завершения:

func makeRequest(url : String, params : [String : String]?, completionHandler: (responseObject: JSON?, error: NSError?) ->()) -> Request? { 

    return Alamofire.request(.GET, url, parameters: params, encoding: .URL) 
     .responseString { request, response, responseBody, error in completionHandler(
      responseObject: 
      { 
       // JSON to return 
       var json : JSON? 

       if let response = responseBody {       
        // Parse the response to NSData 
        if let data = (response as NSString).dataUsingEncoding(NSUTF8StringEncoding) { 
         json = JSON(data: data) 
        } 
       } 

       return json 

       }(), error: error) 
    } 
} 

И тогда вы можете назвать это следующим образом:

self.makeRequest("url", params: nil) { json, error in    

    //handle the error here if you want before 

    println(json)    
} 

я настоятельно рекомендую вам с помощью SwiftyJSON управлять JSON в лучшем и простой способ, это до вас.

Я надеюсь, что это поможет вам.

+0

Как я могу использовать json, вне этой области, я продолжаю получать нуль. – MasterWizard

+0

Проблема в том, что вызов асинхронный, как я уже говорил вам, вам нужно сделать как обработчик, чтобы получить JSON и работать с ним в области. –