2016-05-29 3 views
0

Я пытаюсь написать функцию, которая извлекает JSON из службы в Интернете, но одна из строк (прокомментированная) продолжает возвращать нуль, и я понятия не имею, почему. Любая помощь приветствуется! :) Благодаря!!Почему NSHTTPURLResponse возвращает nil? NSURLSession, Swift 2.2

func parseJSON(long: CLLocationDegrees, lat: CLLocationDegrees) { 

    var longitude : String = "\(long)" 
    var latitude : String = "\(lat)" 

    longitude = longitude.substringToIndex(longitude.characters.indexOf(".")!) 
    latitude = latitude.substringToIndex(latitude.characters.indexOf(".")!) 

    print("\(latitude),\(longitude)") 

    let appId = "xyz" //Insert API Key 
    let urlString = "https://api.openweathermap.org/data/2.5/weather?lat=\(latitude)&lon=\(longitude)&units=metric&appid=\(appId)" 

    let requestURL: NSURL = NSURL(string: urlString)! 
    let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: requestURL) 
    let session = NSURLSession.sharedSession() 
    let task = session.dataTaskWithRequest(urlRequest) { 
     (data, response, error) -> Void in 

     //Keeps returning nil. No idea why. 
     if let httpResponse = response as? NSHTTPURLResponse { 

      print("Success!") 
      let statusCode = httpResponse.statusCode 

      if (statusCode == 200) { 
       print("Everyone is fine, file downloaded successfully.") 
      } else { 
       print("STATUSCODE=\(statusCode)") 
      } 

     } 
    } 

    task.resume() 

} 
+0

NSURLResponse вместо NSHTTPURLResponse – AnthonyR

ответ

1
func dataTaskWithRequest(_ request: NSURLRequest, 
     completionHandler completionHandler: (NSData?, 
            NSURLResponse?, 
            NSError?) -> Void) -> NSURLSessionDataTask 

Исходный метод принимает NSURLResponse. Это ответ запрошенного URL. NSURLResponse может быть любого вида ответа.

NSHTTPURLResponse является подклассом NSURLResponse, вы можете отдать свой ответ на NSHTTPURLResponse только если вы уверены, что ваши ответы WebService кодируют с использованием протокола HTTP. В противном случае приведение будет всегда возвращаться nil.

Кроме того, я вижу, что Webservice, что вы используете имеет некоторые ограничения использования:

Как получить ответ точного API

-Не посылать запросы более 1 раз в 10 минут от одного устройства/одного ключа API. Обычно погода не меняется так часто: .

2 Используйте имя сервера как api.openweathermap.org. Пожалуйста, никогда не используйте IP-адрес сервера.

3 Вызов API по городскому идентификатору вместо имени города, городских координат или почтового индекса . В этом случае вы точно определяете свой город.

4 У бесплатной учетной записи имеется ограничение емкости и доступности данных. Если вы не получите ответ от сервера, не пытайтесь повторить свой запрос , но только через 10 минут. Также мы рекомендуем хранить ваши предыдущие данные запроса.

Теперь я думаю, что ваша проблема может возникнуть оттуда.

Смежные вопросы