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("连接成功!")
}
...
}
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有很详细的解释(看上面给的地址),大家可以研究研究。