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

本文介绍了在Swift中使用GCDAsyncSocket库建立TCP连接时遇到的问题及解决方案。当Swift代码尝试建立TCP连接失败时,发现代码本身并无错误,问题在于GCDAsyncSocket在Swift环境中的使用。通过查阅Stack Overflow找到答案,问题根源在于GCDAsyncSocket.m文件某行代码,需要进行特定调整以适应Swift。详细解释见原文链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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有很详细的解释(看上面给的地址),大家可以研究研究。







评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值