我发现gcdasyncsocket的didreaddata回调有一点不直观,那就是除非发出另一个readdata,否则它不会再次被调用。为什么是这样设计的?期望库的用户启动另一个读取调用以获取回调是正确的还是这是一个设计缺陷?
例如

- (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket {
     ...
    // initiate the first read
    self.socket = newSocket;
    [self.socket readDataWithTimeout:-1 tag:0];
}

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
    // do what you need with the data...

    // read again, or didReadData won't get called!
    [self.socket readDataWithTimeout:-1 tag:0];
}

最佳答案

为什么是这样设计的?
只要您只使用readdatawithtimeout:tag:只要有新的数据到达,就调用delegate方法似乎更直观。
但是readdatawithtimeout:tag:不是使用gcdasyncsocket读取数据的唯一方法。例如,readdatatolength:withtimeout:tag:和readdatatodata:withtimeout:tag:
这两个方法都在传入数据的特定点调用委托,您可能希望在处理过程的不同点调用不同的委托。
例如,如果处理的是流格式,其中有一个CRLF分隔的头,后跟一个长度在头中提供的可变长度的正文,则可能需要在readdatatodata:withtimeout:tag:to读取其分隔符已知的头之间进行交替调用,然后readdatatolength:withtimeout:tag:读取从标题中提取的长度的正文。

关于objective-c - 为什么GCDAsyncSocket readData设计为只能读取一次?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14699155/

10-09 16:17