7

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()

2 Answers2

2

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.

helioz
  • 910
  • 11
  • 22
0

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")
    }
    }
}
Nayan Dave
  • 1,078
  • 1
  • 8
  • 30
Wilson XJ
  • 1,750
  • 13
  • 14
  • No explanation provided as to what's wrong with the code in the question and why it works OK in view controller. The answer does not solve the problem. – helioz Jan 06 '18 at 21:10