2016-06-02 10 views
4

GCDAsyncSocket-Delegaten werden nicht in der swift-Klasse aufgerufen, funktionieren aber in der UIViewController-Klasse sehr gut. Unten ist mein benutzerdefinierter Klassencode, in dieser Klasse wird die Verbindungsfunktion die Socket-Verbindung starten und der Delegat wird nie aufgerufen. Ich suche im Netz und auch auf GCDAsyncSocket Github Repo aber keinen Erfolg.AsyncSocket-Callbacks, die nicht in einer Swift-Klasse aufgerufen werden

class RXSocket: NSObject,GCDAsyncSocketDelegate { 

func connect() { 

    let asyncSocket = GCDAsyncSocket(delegate: self, delegateQueue: dispatch_get_main_queue()) 

    do { 
     try asyncSocket?.connectToHost("www.google.com", onPort: 80) 
    } catch _ as NSError { 
    } 

} 


//MARK:- ASyncSocket Delegate 

func socket(sock: GCDAsyncSocket!, didConnectToHost host: String!, port: UInt16) { 
    print("didConnectToHost") 
} 

func udpSocket(sock: GCDAsyncUdpSocket!, didReceiveData data: NSData!, fromAddress address: NSData!, withFilterContext filterContext: AnyObject!) { 
    print("didReceiveData") 
} 

func socketDidDisconnect(sock: GCDAsyncSocket!, withError err: NSError!) { 
    print("socketDidDisconnect") 
} 

} 

und meiner Ansicht Controller-Klasse

let rxSocket = RXSocket() 
    rxSocket.connect() 
+0

versuchen, @objc für jeden Delegaten func hinzuzufügen, auch brauchen Sie eine starke Referenz zu verweisen oder es wird –

+0

versucht werden, aber kein Glück. –

+0

Überprüfen Sie den ersten Kommentar Ich bearbeite nur –

Antwort

-1

versuchen wie folgt aus:

class RXSocket: NSObject,GCDAsyncSocketDelegate { 
var asyncSocket: GCDAsyncSocket! 
func connect() { 

self.asyncSocket = GCDAsyncSocket(delegate: self, delegateQueue: dispatch_get_main_queue()) 

do { 
    try asyncSocket?.connectToHost("www.google.com", onPort: 80) 
} catch _ as NSError { 
} 

} 
} 
+0

Keine Erklärung gegeben, was mit dem Code in der Frage falsch ist und warum es OK in View-Controller funktioniert. Die Antwort löst das Problem nicht. – helioz

0

ich das gleiche Problem erlebt und haben es gelöst.

Ihr Codebeispiel ist in Ordnung.

Der Grund für den Rückruf nicht funktioniert ist sehr wahrscheinlich, dass Ihr instanzierte Objekt (zB „rxSocket“ bezeichnet)()

Hier ist ein Beispiel für den Code verbinden nicht über den Anruf persistierenden, das das Problem verursacht

func testMyConnection() { 
    let rxSocket = RXSocket() 
    rxSocket.connect() 
} 

die konstante rxSocket wird ungültig, sobald die Funktion gibt da rxSocket nur auf die Funktion lokal ist und zerstört wird, sobald es den Gültigkeitsbereich verlässt.

Die Lösung besteht darin, rxSocket zu einem Objekt zu machen, das über den Aufruf von connect() hinaus besteht, so dass es immer noch verfügbar ist, wenn die Callback-Funktionen von GDCAsyncSocket aufgerufen werden.