Swift - Error Handling

Aus Wikizone
Wechseln zu: Navigation, Suche

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