Hallo,
ich versuche mich gerade in Swift einzuarbeiten in dem ich einen Udemy Kurs zu Swift durcharbeite und einige Tutorials aus dem Internet probiere. Jetzt habe ich ein konkretes Problem und komme nicht so recht weiter und bin dabei auf dieses Forum gestoßen und hoffe das Ihr mir vielleicht auf die Sprünge helfen könnt
Hier nun die Beschreibung zu meinem Problem.
Ich habe einen Task der Daten (Währungsdaten) aus dem Internet lädt und in JSON Format zurück liefert. Ich parse die Daten und möchte dann den Wert, z.B. Kurs EUR zu Dollar, in einem Label anzeigen.
In meinem ersten Versuch habe ich in dem Task, nachdem ich die Daten ermittelt habe, im Label angezeigt. Das funktioniert im Prinzip, führt aber in Xcode zu folgender Warnung (purple):
Wenn ich das "Problem" google, ist mir im Prinzip auch klar was hiermit gemeint ist, man sollte das UI nicht blockieren mit Background Task die unter Umständen sehr lange dauern.
Wenn ich die Daten nicht im Data Task setze, sondern danach, habe ich ein zeitliches Problem, die Abfrage der Daten aus dem Internet dauert z.B. 2s, dann ist das setzen der Label schon durch und wird nicht
mehr aktualisiert wenn der Background Data Task die Daten geholt hat.
Hier mal ein Auszug aus dem Code (ViewController.swift):
Alles anzeigen
Frage:
Wie kann ich das Label mit den Daten aus dem dataTask() automatisch aktualisieren wenn dieser fertig ist?
Gruß
Ralf
ich versuche mich gerade in Swift einzuarbeiten in dem ich einen Udemy Kurs zu Swift durcharbeite und einige Tutorials aus dem Internet probiere. Jetzt habe ich ein konkretes Problem und komme nicht so recht weiter und bin dabei auf dieses Forum gestoßen und hoffe das Ihr mir vielleicht auf die Sprünge helfen könnt
Hier nun die Beschreibung zu meinem Problem.
Ich habe einen Task der Daten (Währungsdaten) aus dem Internet lädt und in JSON Format zurück liefert. Ich parse die Daten und möchte dann den Wert, z.B. Kurs EUR zu Dollar, in einem Label anzeigen.
In meinem ersten Versuch habe ich in dem Task, nachdem ich die Daten ermittelt habe, im Label angezeigt. Das funktioniert im Prinzip, führt aber in Xcode zu folgender Warnung (purple):
Wenn ich das "Problem" google, ist mir im Prinzip auch klar was hiermit gemeint ist, man sollte das UI nicht blockieren mit Background Task die unter Umständen sehr lange dauern.
Wenn ich die Daten nicht im Data Task setze, sondern danach, habe ich ein zeitliches Problem, die Abfrage der Daten aus dem Internet dauert z.B. 2s, dann ist das setzen der Label schon durch und wird nicht
mehr aktualisiert wenn der Background Data Task die Daten geholt hat.
Hier mal ein Auszug aus dem Code (ViewController.swift):
Brainfuck-Quellcode
- import UIKit
- class ViewController: UIViewController {
- @IBOutlet weak var currency_EUR_USD: UILabel!
- @IBOutlet weak var abfrageDatum: UILabel!
- var valueEUR_USD: Double = 0.0
- var valueUSD_EUR: Double = 0.0
- var valueAbfrageDatum: String = ""
- override func viewDidLoad() {
- super.viewDidLoad()
- //self.view.backgroundColor = .lightGray
- // Do any additional setup after loading the view.
- // API Endpoint: https://free.currconv.com/api/v7/convert?q=USD_EUR,EUR_USD&compact=ultra&apiKey=4952f1f9652ee73bff5e
- // Reference: https://www.currencyconverterapi.com
- let urlString = "https://free.currconv.com/api/v7/convert?q=USD_EUR,EUR_USD&compact=ultra&apiKey=4952f1f9652ee73bff5e"
- let url = URL(string: urlString)
- let session = URLSession.shared
- let dataTask = session.dataTask(with: url!) { [self] (data, reponse, error) in
- // check for errors
- if error == nil && data != nil {
- // parse json
- do {
- // Aktuelles Abfrage Datum ermitteln und formatieren
- // Referenz: https://www.ralfebert.de/ios/swift-dateformatter-datumsangaben-formatieren/
- let formatter = DateFormatter()
- formatter.locale = .init(identifier: "de")
- formatter.dateStyle = .medium
- formatter.timeStyle = .medium
- let dateFormattedString = formatter.string(from: Date())
- valueAbfrageDatum = dateFormattedString
- let currency: Currency = try! JSONDecoder().decode(Currency.self, from: data!)
- valueEUR_USD = currency.EUR_USD
- valueUSD_EUR = currency.USD_EUR
- // Set data to label --> Force Warning here!!!!
- abfrageDatum.text = valueAbfrageDatum
- currency_EUR_USD.text = String(valueEUR_USD)
- print("Abfrage@ \(dateFormattedString)")
- print ("1€ = \(currency.EUR_USD)$")
- print ("1$ = \(currency.USD_EUR)$")
- print("------------------------------------------------------------------------------")
- print ("This is JSON result --> \(currency)")
- }
- }
- }
- // Make the API call
- dataTask.resume()
- // Set data to Label
- abfrageDatum.text = valueAbfrageDatum
- currency_EUR_USD.text = String(valueEUR_USD)
- }
- }
Frage:
Wie kann ich das Label mit den Daten aus dem dataTask() automatisch aktualisieren wenn dieser fertig ist?
Gruß
Ralf