您的位置:首页 > 理论基础 > 计算机网络

Swift代码使用GCDAsyncSocket库建立TCP连接失败。

2015-01-11 22:43 579 查看
Swift代码使用GCDAsyncSocket库建立TCP连接失败。

先看下面Swiftl代码:

class TCPSocket: GCDAsyncSocketDelegate {
.
.
.
func connectServer(host: String, port: UInt16) {
tcpConn = GCDAsyncSocket(delegate: self, delegateQueue: socketQueue, socketQueue: socketQueue)
if tcpConn == nil {
return
}
errMsg: NSError?
tcpConn?.connectToHost(host, onPort: port, error: &errMsg)
if let err = errMsg {
println("错误:\(err.localizedDescription)")   //程序会在这输出:Attempting to connect without a delegate. Set a delegate first.
} else {
println("正在连接\(host)...")
}
}

func socket(sock: GCDAsyncSocket!, didConnectToHost host: String!, port: UInt16) {
println("连接成功!")
}

...
}


保证服务端能正常接受连接的情况下,调用connectServer时,老是连接不上,打印出信息:Attempting to connect without a delegate. Set a delegate first.
shen me gui? 代码有错吗?我没有设置代理吗?

其实代码没错,代理也在实例化对象时传了self,不解就google一下,最后在Stackoverflow找到了答案,地址:http://stackoverflow.com/questions/24824753/delegate-not-getting-set

原来是GCDAsyncSocket在Swift中使用存在的一个问题,解决方法也很简单,把GCDAsyncSocket.m这个文件第868行(你的不一定)的这句:

__weak id delegate;


改为

id delegate;
再运行就可以成功连接了!

这是什么原因当然就要去看OC的源代码才清楚,不过老外在Stackoverflow有很详细的解释(看上面给的地址),大家可以研究研究。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: