【问题标题】:AsyncSocket callbacks not being called in a swift classswift 类中未调用 AsyncSocket 回调
【发布时间】:2016-06-02 12:49:40
【问题描述】:

GCDAsyncSocket 委托在 swift 类中没有被调用,但在 UIViewController 类中工作得很好。下面是我的自定义类代码,在这个类中连接函数将启动套接字连接,它的委托永远不会被调用。我在网上搜索,也在 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()

【问题讨论】:

  • 尝试为每个委托函数添加@objc,你也需要一个强引用来引用,否则它将被释放
  • 试过但没有成功。
  • 查看我刚刚编辑的第一条评论
  • 在swift中,我不知道如何制作强大的参考。请提出建议。
  • 这个问题你解决了吗?

标签: ios swift delegates cocoaasyncsocket


【解决方案1】:

我遇到了同样的问题,已经解决了。

您的代码示例很好。

回调不起作用的原因很可能是您的实例化对象(例如“rxSocket”)在调用 connect() 之后没有持续存在

这是导致问题的代码示例

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

一旦函数返回,常量 rxSocket 就变得无效,因为 rxSocket 仅对函数是本地的,一旦超出范围就会被销毁。

解决方案是使 rxSocket 成为一个对象,它在调用 connect() 之后仍然存在,因此当 GDCAsyncSocket 调用回调函数时它仍然可用。

【讨论】:

    【解决方案2】:

    试试这样:

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

    【讨论】:

    • 没有解释问题中的代码有什么问题以及为什么它在视图控制器中可以正常工作。答案并不能解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 2021-02-15
    • 1970-01-01
    相关资源
    最近更新 更多