Swift Session() innerhalb einer Funktion aufrufen und das Ergebnis mit RETURN zurückgeben

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Swift Session() innerhalb einer Funktion aufrufen und das Ergebnis mit RETURN zurückgeben

    Hallo,

    folgende Herausforderung stellt sich mir. Ich rufe eine Funktion auf. In dieser wird eine Session gestartet. Nun würde ich gerne das Ergebnis, welches innerhalb der Session erzeugt wurde zurück an die Funktion liefern. Diese sollte dann das Ergebnis via return() an die aufrufende Funktion liefern.

    Wenn ich DispacthQueue.main.async() verwende, kann ich das Ergebnis zwar direkt an eine Variable, welche in der Klasse deklariert und definiert wurde, übergeben. Doch dies ist weder schön noch übersichtlich.

    Nachfolgender Pyseudo-Code sollte mein Anliegen nochmals verdeutlichen.

    Quellcode

    1. func runSessionURLGetData() -> Data
    2. {
    3. // ReturnValue
    4. var dResualtData: Data = "Error".data(using: .utf8)!
    5. // Define the URL you want to request
    6. let urlString = "https://www.example.com/......"
    7. // Create a URL object from the string
    8. if let strUrl = URL(string: urlString) {
    9. let urlSession = URLSession.shared
    10. let task = urlSession.dataTask(with: strUrl) { data, _, error in
    11. guard let dataFromSession = data else {
    12. debugPrint("Error loading \(String(describing: apiUrl)): \(String(describing: error))")
    13. return
    14. }
    15. // an dieser Stelle erfolgen weitere Berechnungen
    16. dResualtData = dataFromSession
    17. }
    18. task.resume()
    19. }
    20. else
    21. {
    22. print("URL is not valid!")
    23. }
    24. return (dResualtData)
    25. }
    Alles anzeigen

    Diese Funktion liefert jedoch nicht das berechnete Ergebnis, sondern den in Zeile 4. definierten Wert der Variable dResaultData; also "Error".

    Mir ist auch klar, dass die Berechnungen innerhalb von Session in einem anderen Thread stattfinden. Nur finde ich augenblicklich keine Lösung die Variable dResultData aus diesem Session-Thread dem Funktion-Thread zu übergeben, damit dieser dann die Variable via return (s. Zeile 28) zurückliefen kann. ?(

    Kann mir hier jemand den entscheiden Tipp liefern?

    Danke mal vorab.
  • Ich verwende bei asynchroner Verarbeitung häufig Completion Handler, welche dann aufgerufen werden, wenn die Verarbeitung beendet ist.

    In Deinem Fall könntest Du der Funktion runSessionURLGetData einen Completion Handler übergeben, welcher dann im Completion Handler von dataTask aufgerufen wird.
  • Wenn du unbedingt das Ergebnis des URL- Aufrufs innerhalb der Methode haben willst, solltest du einen synchronen Aufruf (z.B . Data(contentsOf:options:) verwenden. Aber damit blockierst du deine komplette UI, was nicht so schön für den Nutzer ist, insbesondere in einer „LieFi“-Umgebung.

    Besser wäre es einen ProgressIndicator (o. Ä.) anzuzeigen, dessen Sichtbarkeit über eine State-Variablen zu steuern. Wenn der Download fertig ist, lässt du den ProgressIndicator über die State-Variable wieder verschwinden, wobei du die Variable unbedingt im Main-Thread aktualisieren solltest.
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    Wenn du unbedingt das Ergebnis des URL- Aufrufs innerhalb der Methode haben willst, solltest du einen synchronen Aufruf (z.B . Data(contentsOf:options:) verwenden. Aber damit blockierst du deine komplette UI, was nicht so schön für den Nutzer ist, insbesondere in einer „LieFi“-Umgebung.

    Besser wäre es einen ProgressIndicator (o. Ä.) anzuzeigen, dessen Sichtbarkeit über eine State-Variablen zu steuern. Wenn der Download fertig ist, lässt du den ProgressIndicator über die State-Variable wieder verschwinden, wobei du die Variable unbedingt im Main-Thread aktualisieren solltest.
    Dein erster Vorschlag ist in der Tat nicht schön.

    Jedoch gefällt mir der Vorschlag der Visualisierung der Prozessbearbeitung umso mehr. Existiert hierfür bereits etwas? Denke da an so etwas wie einen Fortschrittsbalken der von links nach rechts wandert.

    Danke mal vorab. :thumbup: