我正在制作一个 iPhone 应用程序,它连接到服务器(我无法控制其协议)并获取文本数据流,其中每行以 CRLF 结尾,行数以及它们的确切长度是未定。我正在递归地调用GCDAsyncSocket
'readDataToData:withTimeout:tag:
来逐行获取数据。
我以前是从NSStream
同步读取的,所以我会通过调用来知道读取何时完成hasBytesAvailable
。我最近切换到GCDAsyncSocket
,现在我还想知道流何时读取了所有可用数据,以便我可以保存/处理数据、刷新表格、删除覆盖等。
在请求下一次读取之前,我尝试使用与以前类似的技术,在我的socket:didReadData:withTag:
委托方法中调用以下内容:
[asyncSocket performBlock:^{
if (CFReadStreamHasBytesAvailable([sock readStream]))
NSLog(@"CFReadStreamHasBytesAvailable: yes");
else
NSLog(@"CFReadStreamHasBytesAvailable: no");
}];
但结果总是YES
。
我也尝试在发送读取请求后调用该方法progressOfReadReturningTag:bytesDone:total:
,当读取完成时它似乎总是返回 1 ,否则返回 nil ,但我不确定以这种方式使用该方法是否可靠。
也许有人可以告诉我progressOfReadReturningTag:...
在这种情况下是否真的可靠,或者,如果不是,请指出我另一个方向来解决这个问题。