Swift - Error Handling
Aus Wikizone
Links[Bearbeiten]
Swift (Programmiersprache) Swift - Dispatch Queue
Einführung[Bearbeiten]
Fehlerfälle fängt man oft über try catch zusammen mit einer do Schleife ab.
Oft auch zusätzlich mit einem Optional Binding.
Allgemein
func myFunction{
do {
// try sth. which can cause an error
let myVariable = try retreiveMyVariable // Optional Binding. If it fails it will go to catch block
} catch {
// Handle error
}
}
Beispiel
func parseJSON(_ weatherData: Data)->WeatherModel? {
let decoder = JSONDecoder()
// decode needs a type not an object as parameter. We refer to the type with .self i.e. WeatherData.self
do {
let decodedData = try decoder.decode(WeatherData.self, from: weatherData)
let id = decodedData.weather[0].id
let temp = decodedData.main.temp
let name = decodedData.name
let weather = WeatherModel(conditionId: id, cityName: name, temperature: temp)
return weather
} catch {
//print("Error parsing JSON: \(error)")
delegate?.didFailWithError(error: error)
return nil
}
}
Fehlerquellen und Lösungen[Bearbeiten]
DispatchQueue für Thread Probleme[Bearbeiten]
UI API called on a background thread - enn man Änderungen am UI machen möchte und z.B. ein Label aus einem Completion Handler heraus verändert werden soll tritt dieser Fehler auf, denn eine Änderung des UI muss über den Hauptthread ausgeführt werden.
Die Lösung ist der Dispatch Queue. Der Update Code der das UI aktualisieren soll wird in einen Dispatch Queue gewrapt. So kann er automatisch im Hauptthread ausgeführt sobald dieser Zeit hat.
func didUpdateWeather(_ weatherManager:WeatherManager, weather: WeatherModel){
DispatchQueue.main.async {
self.temperatureLabel.text = weather.temperatureStr
}
}