没有在swift类中调用AsyncSocket回调

时间:2016-06-02 12:49:41

标签: ios swift delegates cocoaasyncsocket

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

2 个答案:

答案 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 {
}

}
}