2017-07-05 3 views
0

Ich habe ein Problem beim Drucken von Daten von Weather Underground. Mein Code funktioniert mit anderen Datenquellen, nur nicht mit Weather Underground. Ich habe sogar versucht, die URL mit den tatsächlichen Daten ersetzt werden (dh https://api.wunderground.com/api/APIKEY/forecast/geolookup/forecast/q/94129.json „), aber es wird nicht gedrucktWarum werden meine Wetterdaten nicht in Swift 3 gedruckt?

Irgendwelche Vorschläge auf, was es sein könnte

import Foundation 
import UIKit 

class APIManager { 
    func weatherJSON(zip: String, completion: @escaping ([Weather]) -> Void) { 
     let baseUrlString = "https://api.wunderground.com/api/APIKEY/forecast/geolookup/forecast/q/\(zip).json" 

     guard let url = URL(string: baseUrlString) else { return } 

     let task = URLSession.shared.dataTask(with: url) { (data, response, error) in 
      guard error == nil, let data = data else { return } 

      do { 
       guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? [[String: Any]] else { return } 

       // MARK: Print JSON 
       print(json) 

       var weatherList = [Weather]() 
       for item in json { 
        if let weather = Weather.create(from: item) { 
         weatherList.append(weather) 
        } 
       } 
       completion(weatherList) 
      } catch { 
       print("Uh oh. You have an error with \(zip)!") 
      } 
     } 
     task.resume() 
    } 
} 

EDIT:.? GELÖST

I . der Code geschrieben unten verwendet haben und jetzt sehe Fehler

+1

Guter erster Schritt würde sein, eine debugging Nachrichten in alle Ihre Wächteranweisungen zu kleben, um zu sehen, ob irgendwelche optionals nicht auspacken – XmasRights

+1

Ihre 'Wächter' Aussage sagt effektiv" wenn es einen Fehler gibt, erzählen Sie mir nicht, aber gerade sofort Rückkehr." Also, ändern Sie das, um den Fehler vor der Rückgabe zu drucken. Oder, besser, ändern Sie Ihre Schließung zu sein "([Wetter] ?, Fehler?) -> Void", so dass Sie den Anrufer informieren können, wenn es einen Fehler gab, und es tun kann, was Sie in der Benutzeroberfläche zu melden/behandeln benötigen der Fehler. – Rob

Antwort

1

ich würde vorschlagen, diese Fehler melden Wechsel:

enum WeatherError Error { 
    case badURL 
    case invalidJSON 
} 

func weatherJSON(zip: String, completion: @escaping ([Weather]?, Error?) -> Void) { 
    let baseUrlString = "https://api.wunderground.com/api/APIKEY/forecast/geolookup/forecast/q/\(zip).json" 

    guard let url = URL(string: baseUrlString) else { 
     completion(nil, WeatherError.badURL) 
     return 
    } 

    let task = URLSession.shared.dataTask(with: url) { (data, response, error) in 
     guard error == nil, let data = data else { 
      completion(nil, error) 
      return 
     } 

     do { 
      guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? [[String: Any]] else { 
       completion(nil, WeatherError.invalidJSON) 
       return 
      } 

      // MARK: Print JSON 
      print(json) 

      var weatherList = [Weather]() 
      for item in json { 
       if let weather = Weather.create(from: item) { 
        weatherList.append(weather) 
       } 
      } 
      completion(weatherList, nil) 
     } catch let parseError { 
      print("Uh oh. You have an error with \(zip)!") 
      if let responseString = String(data: data, encoding: .utf8) { 
       print("responseString = \(responseString)") 
      } 
      completion(nil, parseError) 
     } 
    } 
    task.resume() 
} 

Dann, wenn Sie es nennen, können Sie sehen, was der Fehler

weatherJSON(zip: something) { weatherReports, error in 
    guard let weatherReports = weatherReports, error == nil else { 
     print(error) 
     return 
    } 

    // use weatherReports here 
} 

ist Dies wird nicht Ihr Problem lösen, aber es wird Ihnen helfen, zu diagnostizieren, was das Problem war.

+0

Vielen Dank! Fehlermeldungen werden jetzt angezeigt. – Wes

Verwandte Themen