OSX / Swift / NSViewController / URLSession / JSON / gesucht wird eine effizientere Alternative

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

  • OSX / Swift / NSViewController / URLSession / JSON / gesucht wird eine effizientere Alternative

    Hallo Zusammen,

    die Abfrage bzw. der Empfang von Daten eines PHP-Scriptes habe ich bisher asynchron (via URLSession.shared) durchgeführt, damit der main-Thread nicht blockiert wird.

    Das Ergebnis wurde bisher innerhalb des CompleationHandler() bearbeitet und dann via DispatchQueue() zurück an den aufrufenden ViewController zurückgeliefert.

    Nun benötige ich eine etwas universellere Methode, da die Berechnungen (innerhalb des CompleationHandler() zu komplex geworden sind und damit einfach zu viel Zeit beansprucht wird bevor Teilergebnisse angezeigt werden können, hinzu kommt, dass die abzurufen Daten nun aus verschiedenen Quellen zusammengestellt werden müssen.

    Vielleicht bin ich hier auf völlig auf dem Holzweg. Jedoch wollte ich mir die Menge an Daten einfach an den ViewController liefern lassen und in diesem die Berechnungen aufteilen sprich Semaphore nutzen. Damit ich schneller Teilergebnisse darstellen kann.

    Die Verarbeitung der Daten wird gestartet wenn die voneinander abhängigen Daten im VC eingetroffen sind (auch dieser Thread läuft asynchron ab).

    Nun zu meiner Frage: Gibt es einen effizienteren Ablauf bzw. Vorgehensweise? Hat jemand einen Vorschlag?

    Danke mal vorab.
  • MCDan schrieb:

    Alternativ könnte der Thread zur Verarbeitung der Daten auch Notifications senden, wenn neue Teilergebnisse fertig sind. Der Main Thread könnte dann auf diese Notifications reagieren und das UI aktualisieren.
    Der Vorschlag Notification zu nutzen ist prima. Gestaltet die Verwaltung der Teilergebnisse bestimmt einfacher.

    Habe gerade mal ein wenig nach einem Beispiel gesucht und bin hier (Creating Push Notifications in… - iOS (Beginner’s Guide)) fündig geworden.

    Werde mal einen Playground nutzen um dieses Thema zu vertiefen.

    @'MCDan: Danke für Deinen Vorschlag. :thumbup:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von OSXDev ()

  • OSXDev schrieb:

    Habe gerade mal ein wenig nach einem Beispiel gesucht und bin hier (Creating Push Notifications in… - iOS (Beginner’s Guide)) fündig geworden.
    Achtung: @MCDan meinte "Notifications" (mit Observern), nicht "User Notifications" (aka Push) - blöde Namensgleichheit bei Apple.

    Nutze ich auch sehr gerne für lockere Kopplungen, um eine (evt. auch unbekannte) Menge an "Subscribern" über z. B. Updates zu informieren (Datenmodell, Purchases etc.).

    War wohl zu spät ;) Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • OSXDev schrieb:

    ...

    die Abfrage bzw. der Empfang von Daten eines PHP-Scriptes habe ich bisher asynchron (via URLSession.shared) durchgeführt, damit der main-Thread nicht blockiert wird.

    Das Ergebnis wurde bisher innerhalb des CompleationHandler() bearbeitet und dann via DispatchQueue() zurück an den aufrufenden ViewController zurückgeliefert.

    ...
    Zu dem obigen Ablauf habe ich eine Anmerkung, die mir irgendwie etwas Kopfzerbrechen bereitet.

    Wenn ich URLSession.shared() mit einem CompleationHandler() nutze, dann benötige ich DispatchQueue() nicht, der MainThread kann auf das Ergebnis (es handelt sich um Array, welches in der VCClass deklariert und definiert wurde) zugreifen. Zumindest wenn ich meinen Code mit dem Debugger mal durchgehe. ?(
    Warum ist dies so, oder bin ich schon wieder zu müde und sehe den Wald vor lauter Bäumen nicht mehr? :saint:
  • OSXDev schrieb:

    Wenn ich URLSession.shared() mit einem CompleationHandler() nutze, dann benötige ich DispatchQueue() nicht, der MainThread kann auf das Ergebnis (...) zugreifen.
    Ich mag jetzt vollkommen daneben liegen, aber der CompletionHandler wird doch in der Delegate-Queue der URLSession aufgerufen. Wenn Du dort die Shared-Session verwendest (ohne eine eigene Queue anzugeben), befindest Du Dich vielleicht noch im MainThread?

    Mal so aus der Hüfte, Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • MyMattes schrieb:

    OSXDev schrieb:

    Wenn ich URLSession.shared() mit einem CompleationHandler() nutze, dann benötige ich DispatchQueue() nicht, der MainThread kann auf das Ergebnis (...) zugreifen.
    Ich mag jetzt vollkommen daneben liegen, aber der CompletionHandler wird doch in der Delegate-Queue der URLSession aufgerufen. Wenn Du dort die Shared-Session verwendest (ohne eine eigene Queue anzugeben), befindest Du Dich vielleicht noch im MainThread?
    Mal so aus der Hüfte, Mattes
    Dachte ich zuerst auch. Jedoch erhalte ich keinen Hinweis, dass ich den MainThread nicht unterbrechen darf. Dies wäre eigentlich ein Indiz, dass ich den Main-Thread nicht verlassen hätte.

    Um sicherzustellen, dass ich hier nicht im selben Thread bin, habe ich mir die IDs ausgeben lassen:
    <_NSMainThread: 0x600000464e40>{number = 1, name = main}
    <NSThread: 0x600000414900>{number = 5, name = (null)}

    Ich bin maximal irritiert. Zumal ich diese Vorgehensweise bisher immer so angewendet habe. ?(

    Wenn ich Dispatch-Queue anwende, weist das Array im Main-Thread nil aus. :?:
  • Irgendwie wird es immer kurioser denn DispatchQueue() funktioniert. :thumbup:

    Jedoch nur für die von urlSession.dataTask() gelieferten Daten; welche ich innerhalb von DispatchQueue() an den Main-Thread übergebe. ;(

    Für alle anderen Variablen (bei Nutzung innerhalb von DispatchQueue()) bleibt es bei der Tatsache, dass diese den Wert nil im Main-Thread erhalten! ?(

    Ich hoffe jemand kann mir hier den richtigen Anhaltspunkt liefern.


    Nachtrag: Alle weiteren Variablen lassen sich nur innerhalb des CompletitionHandler() - also außerhalb von DispatchQueue() - an den Main-Thread übergeben. =O

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von OSXDev ()

  • MyMattes schrieb:

    OSXDev schrieb:

    Habe gerade mal ein wenig nach einem Beispiel gesucht und bin hier (Creating Push Notifications in… - iOS (Beginner’s Guide)) fündig geworden.
    Achtung: @MCDan meinte "Notifications" (mit Observern), nicht "User Notifications" (aka Push) - blöde Namensgleichheit bei Apple.
    Nutze ich auch sehr gerne für lockere Kopplungen, um eine (evt. auch unbekannte) Menge an "Subscribern" über z. B. Updates zu informieren (Datenmodell, Purchases etc.).

    War wohl zu spät ;) Mattes
    "Notifications" sind eine sehr feine Einrichtung. :thumbup:

    Innerhalb von Notifications können auch Objekte übergeben werden. Perfekt :thumbsup:

    Es wäre schon sehr interessant obige Herausforderung zu lösen. Leider bin ich selbst mit Hilfe des Debuggers nicht auf den Kern gestossen. :/
  • mihema schrieb:

    Wenn die Bearbeitung im CompletionHandler zu lange dauert, würde ich das alles in eine eigene Funktion auslagern und die mit async - await aufrufen. Habe jetzt nicht ausprobiert, ob das geht, aber sollte eigentlich. Damit arbeitet deine App weiter und wartet im Hintergrund auf die Fertigstellung des Tasks.
    Hallo,
    danke für den Hinweis. Jedoch müsste ich dann das Redesign des Workflows (async vs sync) der App erneut überarbeiten. Zum jetzigen Zeitpunkt passt dies leider nicht. Habe es mal notiert.