Reputation:
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
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
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