GCDAsyncSocket委托没有在swift类中调用,但在UIViewController类中工作得很好。下面是我的自定义类代码,在这个类中,connect函数将启动套接字连接,它的委托将永远不会被调用。我在网上搜索,也在GCDAsyncSocket github repo上搜索,但没有成功。
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")
}
}
并在我的视图控制器类
中 let rxSocket = RXSocket()
rxSocket.connect()
答案 0 :(得分:1)
我遇到了同样的问题,并解决了它。
您的代码示例没问题。
回调不起作用的原因很可能是你的实例化对象(例如" rxSocket")在调用connect()之后没有持续存在
以下是导致问题的代码示例
func testMyConnection() {
let rxSocket = RXSocket()
rxSocket.connect()
}
一旦函数返回,常量rxSocket变为无效,因为rxSocket仅对函数是本地的,并且一旦超出范围就被销毁。
解决方案是使rxSocket成为一个对象,该对象在调用connect()之后仍然存在,因此当GDCAsyncSocket调用回调函数时它仍然可用。
答案 1 :(得分:-1)
尝试这样:
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 {
}
}
}