Klasse im Hintergrund mitlaufen lassen

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

  • Klasse im Hintergrund mitlaufen lassen

    Moinsen,

    Ich hab da mal ne Frage...
    Geht denke ich eher in die richtung Basis Wissen...

    Ich habe diverse Swift Files mit diversen Klassen drin.
    Soweit ist das alles noch logisch.
    Ich versuche pro Storyboard nur ein Swift file zu machen.
    Dieses Swift File covert dann alle Klassen die das Storyboard benütze.

    Nun die Frage die ich nun habe...
    Ich habe ein App geschrieben welches API requests zu verschiedenen Server macht. (websocket API)
    Nun habe ich das bis jetzt in jedem Storyboard Swift File selbst das hadling der API gemacht.
    Ich habe nun alle Requests aus den diversen Swift Files rausgenommen und diese in ein zentrales Swift File "ApiHandling" gepackt.
    Für die diversen requests habe ich funktionen erstellt.

    Wie kann ich nun diese Klasse "ApiHandling" als erstes starten und immer im "Hintergrund" laufen lassen?

    hier mal ein Beispiel:

    Quellcode

    1. import Foundation
    2. import Starscream
    3. class ApiHandler: WebSocketDelegate, WebSocketPongDelegate {
    4. //---------------------------------------- API Hanlder ----------------------------------
    5. func websocketDidConnect(socket: WebSocketClient) {
    6. print("websocket is connected")
    7. }
    8. func websocketDidDisconnect(socket: WebSocketClient, error: Error?) {
    9. if let e = error {
    10. print("websocket is disconnected: \(e.localizedDescription)")
    11. } else {
    12. print("websocket disconnected")
    13. }
    14. }
    15. func websocketDidReceiveMessage(socket: WebSocketClient, text: String) {
    16. }
    17. func websocketDidReceiveData(socket: WebSocketClient, data: Data) {
    18. print("Received data: \(data.count)")
    19. }
    20. func websocketDidReceivePong(socket: WebSocketClient, data: Data?) {
    21. print("Ping detected and answered")
    22. }
    23. var socket = WebSocket(url: URL(string: "LINK")!, protocols: ["chat", "superchat"])
    24. socket.connect()
    25. //functions
    26. }
    Alles anzeigen

    Für die generelle Kommunikation der API abfragen benütze ich Starscream.

    Ich denke mal ich verfolge schon den richtigen Ansatz oder nicht?
    Es macht ja keinen Sinn, in jeder Datei die requests und alles zu handlen. Da mache ich besser ein dediziertes File mit einer dedizierten klasse oder nicht?

    Nochmal kurz zusammengefasst:
    Die Klasse ApiHandler soll als erstes aufgerufen werden, da diese die Connection zu dem Server steuert.
    Die Klasse soll dann immer im Hintergund laufen. so dass die verbindung immer von der Klasse kontrolliert wird.

    Das Ziel:
    Die API Verbinung wird zentral con einer Klasse getsteuert.
    Alle anderen Klassen greiffen dann über Funktionen darauf zu.
  • Ich versuche einmal, etwas zu sortieren:
    • Du hast pro Storyboard diverse Controller-Klassen für die verschiedenen Windows / Views, die Du aber alle in einer Swift-Datei zusammenfasst? Würde ich persönlich nicht so machen, sondern immer eine Datei pro Klasse verwenden.
    • Es gibt ("Backend"-) Code, der eigentlich nichts mit der Benutzeroberfläche zu tun hat, sondern Funktionen für Dein Daten-Modell zur Verfügung stellt: Ja, das schreit nach eigenen Klassen, deren Methoden nichts in irgendwelchen UI-Controller-Klassen zu suchen haben.
    • Wo Du diesen API-Handler instanzierst (und z. B. als Property hältst), hängt von dem Anwendungsfall ab. Ich würde eigentlich immer dann, wenn ich entsprechende Requests absetzen möchte, eine neue Instanz erzeugen und die nach Erledigung ihre Aufgaben wieder freigeben. Alternativ könntest Du auch eine "zentrale" Instanz im AppDelegate erzeugen und als dessen Property in Deiner App ansprechen. Allerdings ergeben sich hier schnell ungewollte Nebeneffekte, da Du nicht sauber kapselst.
    • Es geht nicht darum, ob dieser API-Handler im Hintergrund läuft - ich vermute, hier hast Du einfach den falschen Ausdruck gewählt - sonder, dass er im "Hintergrund" existiert und angesprochen werden kann. Nebenläufigkeit im Sinne einer asynchronen Abarbeitung von Prozessen ist ein weiteres Thema, das aber mit derartigen Handler-Klassen gut realisierbar ist.
    Insgesamt solltest Du Dich einmal mit dem MVC-Konzept ("Model-View-Controller") auseinandersetzen, das erläutert die entsprechenden Grundlagen ... letztlich ist Dein Gedanke schon richtig (gemeint).

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • MyMattes schrieb:


    • Wo Du diesen API-Handler instanzierst (und z. B. als Property hältst), hängt von dem Anwendungsfall ab. Ich würde eigentlich immer dann, wenn ich entsprechende Requests absetzen möchte, eine neue Instanz erzeugen und die nach Erledigung ihre Aufgaben wieder freigeben. Alternativ könntest Du auch eine "zentrale" Instanz im AppDelegate erzeugen und als dessen Property in Deiner App ansprechen. Allerdings ergeben sich hier schnell ungewollte Nebeneffekte, da Du nicht sauber kapselst.


    Die ganze App bestelt eigentlich nur aus API sends und requests. Meine Idee war nicht jedes mal ein connect und ein authenticate zu machen sondern die verbindung immer offen zu lassen.
    Ich muss die Daten sowiso alle 3 Sekunden abfragen, aus meiner sicht macht es mehr Sinn, dann die verbindung offen zu lassen.
    Websockets lässt dies ja zu und so wie ich es verstanden habe dient es ja genau dafür.


    MyMattes schrieb:


    • Es geht nicht darum, ob dieser API-Handler im Hintergrund läuft - ich vermute, hier hast Du einfach den falschen Ausdruck gewählt - sonder, dass er im "Hintergrund" existiert und angesprochen werden kann. Nebenläufigkeit im Sinne einer asynchronen Abarbeitung von Prozessen ist ein weiteres Thema, das aber mit derartigen Handler-Klassen gut realisierbar ist.


    Ich denke ich meine schon im hintergrund...
    Ich kann ja immer auf die Klasse zugreiffen wenn ich das will. Die frage die sich mir stellt ist nur wie kann ich diese offen lassen wenn ich über mehrere Storyboards gehe.
    Der code auschnitt oben funktioniert nicht da ich nicht genau weiss wie ich es instanzieren kann...
    Ich weiss das ich es mit init(ApiHandler) oder indem ich es einer variable zuweise.
    Die delegates scheinen aber nicht zu funktionieren...

    bei einem UIViewController sieht das ja so aus:

    Quellcode

    1. override func viewDidLoad() {
    2. super.viewDidLoad()
    3. socket.delegate = self
    4. }
    da das oben aber kein UIViewController ist weiss ich nicht wie genau ich die delegation anstossen kann.




    MyMattes schrieb:

    Insgesamt solltest Du Dich einmal mit dem MVC-Konzept ("Model-View-Controller") auseinandersetzen, das erläutert die entsprechenden Grundlagen ... letztlich ist Dein Gedanke schon richtig (gemeint).

    Im eigentlichen sinn entspricht es dem ja auch.
    Ich habe die view welches daten an den controller schickt.
    Dieser wiederrum schickt die daten dann an das "model" welches dann die daten aufbereitet.
    Das model läuft nur bei mir immer und hält die verbingung offen.
  • Jetzt werden zwar einige lauthals schreien, aber verwende dafür doch ein Singleton. Es gibt ja nur eine App und daher kann auch Dein API-Client als Singleton existieren. Ich sehe kein Problem darin.

    Wenn Du kein Singleton verwenden möchtest, dann erstelle den API-Client im App Delegate. Der Zugriff darauf kann dann über ein Property erfolgen.

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

  • @quei: Ja, das mag jetzt oberlehrerhaft oder pedantisch wirken, aber wenn sich der Fragende nicht einmal die Mühe der grundsätzlichen Gross-/Kleinschreibung und Satzzeichen macht, habe ich auch wenig Motivation, Zeit in eine Antwort zu investieren.

    Meiner Meinung nach eine Frage des Respekts (und der Lesbarkeit): Wenn die Fragestellung schon auf die Schnelle geschieht, werden Antworten wohl auch nur überflogen und nicht inhaltlich nachvollzogen.

    Sorry, wenn das jetzt bei Dir landet, es fiel mir bei Deinem Posting zum x-ten Mal auf, diesmal habe ich reagiert...

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • MyMattes schrieb:

    @quei: Ja, das mag jetzt oberlehrerhaft oder pedantisch wirken, aber wenn sich der Fragende nicht einmal die Mühe der grundsätzlichen Gross-/Kleinschreibung und Satzzeichen macht, habe ich auch wenig Motivation, Zeit in eine Antwort zu investieren.

    Meiner Meinung nach eine Frage des Respekts (und der Lesbarkeit): Wenn die Fragestellung schon auf die Schnelle geschieht, werden Antworten wohl auch nur überflogen und nicht inhaltlich nachvollzogen.

    Sorry, wenn das jetzt bei Dir landet, es fiel mir bei Deinem Posting zum x-ten Mal auf, diesmal habe ich reagiert...

    Mattes
    Nur weil es auf dich so wirkt muss es nicht so sein.
    Das ist nun das zweite Mal (bei zwei Posts) dass ich hier dumm angemacht werde.
    Ist wohl ein sehr hochstehendes Forum, kein Wunder gibt es nicht viele die was mit Swift machen wenn alle so drauf sind.


    MCDan schrieb:

    Jetzt werden zwar einige lauthals schreien, aber verwende dafür doch ein Singleton. Es gibt ja nur eine App und daher kann auch Dein API-Client als Singleton existieren. Ich sehe kein Problem darin.

    Wenn Du kein Singleton verwenden möchtest, dann erstelle den API-Client im App Delegate. Der Zugriff darauf kann dann über ein Property erfolgen.
    Ich danke dir für den Post.
    Das war mein letzter hier, ich scheine nicht erwünscht zu sein.
  • quei schrieb:

    Das ist nun das zweite Mal (bei zwei Posts) dass ich hier dumm angemacht werde.
    Wenn mein Kommentar bei Dir schon in die Kategorie „dumm anmachen“ fällt, wirst Du es auch woanders schwer haben ... aber das ist Deine Entscheidung.

    Ich stehe zu meiner Aussage, dass die Form eines Beitrages den Respekt gegenüber dessen Lesern widerspiegelt.

    BTW, den Hinweis bzgl. Property des AppDelegates hast Du geflissentlich ignoriert ... das wäre eine Lösung für Dein Problem gewesen.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Respektlos ist wenn man neue Leute in einem Forum derart belehren muss.
    Zudem könnte man mir auch einfach eine Nachricht schreiben...
    Was du natürlich absichtlich nicht gemacht hast. Besser öffentlich an den Pranger stellen das sowas hier nicht erwünscht ist :D
    Aber natürlich du hast ja nur aus deiner Sicht geschrieben. ;)

    Es zwingt dich keine zum Lesen oder zum Antworten, auch wenn ich froh gewesen wäre.

    Und nein, deinen Hinweis habe ich nicht ignoriert, ich bin am testen.
    Deshalb noch kein Feedback, aber es wird auch keins mehr geben.

    Ich bin nicht dumm, ich weiss, wenn ich nicht erwünscht bin.
    Deine Antworten waren sowieso immer etwas sehr bemüht, du gibts einem das Gefühl alles falsch zu machen.
    Aber passt schon...
    Es gibt noch andere Foren die etwas normaler drauf sind.

    Wenn für dich Respektlosigkeit bereits schlechte Rechtschreibung ist, möchte ich nicht wissen wie du mit Leuten umgehst, die richtig respektlos sind.
    Mein Profil wird am 3 Januar gelöscht, leider kann man es nicht sofort machen, dann musst du dir meine respektlosen Posts nicht mehr ansehen.
  • quei schrieb:

    Respektlos ist wenn man neue Leute in einem Forum derart belehren muss.
    Zudem könnte man mir auch einfach eine Nachricht schreiben...
    Was du natürlich absichtlich nicht gemacht hast. Besser öffentlich an den Pranger stellen das sowas hier nicht erwünscht ist :D
    Aber natürlich du hast ja nur aus deiner Sicht geschrieben. ;)

    Es zwingt dich keine zum Lesen oder zum Antworten, auch wenn ich froh gewesen wäre.

    Und nein, deinen Hinweis habe ich nicht ignoriert, ich bin am testen.
    Deshalb noch kein Feedback, aber es wird auch keins mehr geben.

    Ich bin nicht dumm, ich weiss, wenn ich nicht erwünscht bin.
    Deine Antworten waren sowieso immer etwas sehr bemüht, du gibts einem das Gefühl alles falsch zu machen.
    Aber passt schon...
    Es gibt noch andere Foren die etwas normaler drauf sind.

    Wenn für dich Respektlosigkeit bereits schlechte Rechtschreibung ist, möchte ich nicht wissen wie du mit Leuten umgehst, die richtig respektlos sind.
    Mein Profil wird am 3 Januar gelöscht, leider kann man es nicht sofort machen, dann musst du dir meine respektlosen Posts nicht mehr ansehen.
    Mattest ist hier Moderator, von daher kümmert er sich darum.

    Dein kindisches Abtreten spiegelet es aber auch gut wieder.

    Viel Glück in anderen Foren, Stackoverflow würde viele solcher Posts erst garnicht zulassen und oder löschen ¯\_(ツ)_/¯
  • Wenn deine App alle 3s einen Request schicken muss, dann ist das Konzept scheisse. Request schickt man auf Anforderung des Users und nicht zyklisch. Wenn du eine ständige Aktualisierung brauchst, dann mach das serverseitig über sockets z.b. Oder nutzt Push notifications. Polling auf einen Server ist auf jeden Fall Schrott und ich würde mich bedanken wenn deine App mir min Datenvolumen in 30min wegfrisst weil sie schlecht programmiert ist.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • quei schrieb:

    Nur weil es auf dich so wirkt muss es nicht so sein.
    Das ist nun das zweite Mal (bei zwei Posts) dass ich hier dumm angemacht werde.
    Ist wohl ein sehr hochstehendes Forum, kein Wunder gibt es nicht viele die was mit Swift machen wenn alle so drauf sind.
    Einer? Tausende!

    quei schrieb:

    Das war mein letzter hier, ich scheine nicht erwünscht zu sein.
    Tschö!
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?