要包含的代码不多,但为什么GCDAsyncSocket客户端会在writeData排队之前停止读取?症状:
令人难以置信的是,调用“writeDelayed”方法(仅将“writeData”方法排入队列)可以正确处理所有读取。从方法中删除“writeData”会禁用读取。
这让我觉得配置的GCD调度队列是错误的,所以我尝试了每个新的默认串行和并发队列
或者套接字对象在它的时间之前被释放,所以我把它作为一个类属性,但没有用。
可能使事情变得复杂的一件事(虽然我不知道如何),是为了响应已解析的NSNetService(Bonjour)对象而进行的连接,该对象可能位于不同的调度队列中。但我尝试将“setupConnection”包装在一个块中,以便在主队列上执行,但无济于事。
这里有少量代码,如果有任何问题我会编辑。
谢谢你, 詹姆斯
-(void)setupConnection
{
self.queue = dispatch_queue_create(NULL, DISPATCH_QUEUE_SERIAL);
self.socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:self.queue];
}
-(void)connect
{
NSError *error = nil;
if(![self.socket connectToHost:self.socketInfo.address onPort:self.socketInfo.port error:&error])
{
NSLog(@"I goofed: %@", error);
}
NSLog(@"Connecting to: %@:%i",self.socketInfo.address,self.socketInfo.port);
}
-(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port
{
NSLog(@"Connected");
[self.socket readDataToData:[GCDAsyncSocket CRLFData] withTimeout:-1 tag:0];
}
-(void)writeDelayed
{
double delayInSeconds = 2000000.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
NSData* dataObj = [GCDAsyncSocket CRLFData];
[self.socket writeData:dataObj withTimeout:-1 tag:1];
});
}
...
答案 0 :(得分:1)
答案是我的对象链中的一个较高的对象被提前释放,导致套接字也提前释放。这看起来很明智。