NSStream Timeout / Multithreading Timer?

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

  • NSStream Timeout / Multithreading Timer?

    Hallo,
    ich bin neu hier im Forum, daher tut es mir Leid falls ich mich nicht an eventuelle Riten bezüglich Code-Zitaten usw. halte, es passiert nicht mit böser Absicht ;) .
    Ich weiß außerdem dass es im Internet bereits einige "Ausführungen" bezüglich dieses Themas gibt, leider hat mir bisher nichts weitergeholfen.

    Mit Netzwerkprogrammierung an sich habe ich in anderen Sprachen schon etwas Erfahrung, mit Swift nur leider noch nicht.

    Jetzt zu meinem Problem:
    Meine App verbindet sich via TCP mit einem Server (der läuft auf einem Raspberry Pi). Solange der Nutzer die korrekte IP eingibt funktioniert das auch noch ganz gut.

    Wenn jedoch eine IP/ein Hostname angegeben wird den es im Netzwerk nicht gibt oder auf dem kein Server antwortet bleibt alles hängen (ist ja auch kein Wunder, in einem einzelnen Thread). Ein logischer Lösungsansatz wäre für mich einfach den Timeout auf z.B. 2 sec. zu setzten, das sollte im lokalen Netz ja funktionieren. Ich habe nur leider bisher nichts dazu gefunden wie man den Timeout verändern kann falls es überhaupt geht.

    Ein anderer Lösungsansatz wäre, vor dem Versuch mit dem Server zu verbinden einen Timer zu starten, der dann nach gegebener Zeit den Versuch abbricht.
    Leider habe ich auch damit so meine Probleme. Der Timer macht alles was er soll - nur leider nachdem die Verbinden-Routine durchgelaufen ist (Das habe ich getestet indem ich ihn bei erfolgreicher Verbindung nicht wie normalerweise unterbrochen, sondern weiterlaufen lassen habe. Nachdem die Verbindung steht wartet er also 2 sec. und killt die Verbindung dann wieder).

    Meine Frage ist jetzt:
    Wie löst man das Problem als Profi? Gibt as noch ganz andere Ansätze? Und wenn man es mit einem Timer macht wäre es nett wenn man mir Hilfestellung geben könnte was das Multithreading angeht - das habe ich in Swift nämlich noch nie gemacht.


    Vielen Dank für die Hilfe, freue mich auf Antworten! :)
    Gruß,
    der SwiftNoob

    (Hier mein Code, habe das mit Timer da wieder rausgenommen)

    Quellcode

    1. func NetworkEnable() {
    2. if (addr == ""){
    3. messagebox("Fehlende Einstellungen", nachricht: "Es ist kein Server angegeben!")
    4. return
    5. }
    6. NSStream.getStreamsToHostWithName(addr, port: port, inputStream: &inStream, outputStream: &outStream)
    7. inStream?.delegate = self
    8. outStream?.delegate = self
    9. inStream?.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
    10. outStream?.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
    11. inStream?.open()
    12. outStream?.open()
    13. buffer = [UInt8](count: 200, repeatedValue: 0)
    14. }
    15. func stream(aStream: NSStream, handleEvent eventCode: NSStreamEvent) {
    16. switch eventCode {
    17. case NSStreamEvent.EndEncountered:
    18. inStream?.close()
    19. inStream?.removeFromRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
    20. outStream?.close()
    21. outStream?.removeFromRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
    22. case NSStreamEvent.ErrorOccurred:
    23. inStream?.close()
    24. inStream?.removeFromRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
    25. outStream?.close()
    26. outStream?.removeFromRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
    27. case NSStreamEvent.HasBytesAvailable:
    28. if aStream == inStream {
    29. inStream!.read(&buffer, maxLength: buffer.count)
    30. let bufferStr = NSString(bytes: &buffer, length: buffer.count, encoding: NSUTF8StringEncoding)
    31. let data = bufferStr! as String
    32. //INPUT VERARBEITEN####
    33. print(bufferStr!)
    34. }
    35. case NSStreamEvent.HasSpaceAvailable:
    36. case NSStreamEvent.None:
    37. case NSStreamEvent.OpenCompleted:
    38. default:
    39. }
    40. }
    Alles anzeigen