user2021205
user2021205

Reputation:

AsyncSocket callbacks not being called in a swift class

GCDAsyncSocket delegates not being called in swift class, but works very well in UIViewController class. Below is my custom class code, in this class connect function will start socket connection and it's delegate will never called. I search on net and also on GCDAsyncSocket github repo but no success.

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")
}

}

and in my view controller class

    let rxSocket = RXSocket()
    rxSocket.connect()

Upvotes: 7

Views: 1059

Answers (2)

Wilson XJ
Wilson XJ

Reputation: 1760

try like this:

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

    self.asyncSocket = GCDAsyncSocket(delegate: self, delegateQueue: DispatchQueue.main)

    do {
        try asyncSocket.connect(toHost: "www.google.com", onPort: 80)
    } catch _ as NSError {
        print("Catch")
    }
    }
}

Upvotes: 0

helioz
helioz

Reputation: 910

I experienced the same problem and have solved it.

Your code sample is fine.

The reason for the call back not working is most likely that your instantiated object (e.g. "rxSocket") is not persisting beyond the call to connect()

Here is an example of code which will cause the problem

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

The constant rxSocket becomes invalid once the function returns since rxSocket is local only to the function and is destroyed once it goes out of scope.

The solution is to make rxSocket an object which persists beyond the call to connect() so it is still available when the callback functions is called by GDCAsyncSocket.

Upvotes: 2

Related Questions