Ios 如何知道何时使用GCDAsyncSocket';s readStream是否读取了无限量的数据?

Ios 如何知道何时使用GCDAsyncSocket';s readStream是否读取了无限量的数据?,ios,cocoa-touch,networking,gcdasyncsocket,Ios,Cocoa Touch,Networking,Gcdasyncsocket,我正在制作一个iPhone应用程序,它连接到一个服务器(我无法控制其协议),并获取一个文本数据流,其中每一行以CRLF结尾,而行的数量以及它们的确切长度尚未确定。我正在递归调用GCDAsyncSocket的readDataToData:withTimeout:tag:以逐行获取数据 我以前是同步读取NSStream,因此我可以通过调用hasBytesAvailable来知道读取何时完成。我最近切换到了GCDAsyncSocket,现在我还想知道流何时读取了所有可用数据,这样我就可以保存/处理数据

我正在制作一个iPhone应用程序,它连接到一个服务器(我无法控制其协议),并获取一个文本数据流,其中每一行以CRLF结尾,而行的数量以及它们的确切长度尚未确定。我正在递归调用
GCDAsyncSocket
readDataToData:withTimeout:tag:
以逐行获取数据

我以前是同步读取
NSStream
,因此我可以通过调用
hasBytesAvailable
来知道读取何时完成。我最近切换到了
GCDAsyncSocket
,现在我还想知道流何时读取了所有可用数据,这样我就可以保存/处理数据、刷新表、删除覆盖等

我尝试使用与以前类似的技术,在请求下一次读取之前,在我的
socket:didReadData:withTag:
delegate方法中调用以下命令:

[asyncSocket performBlock:^{
    if (CFReadStreamHasBytesAvailable([sock readStream]))
        NSLog(@"CFReadStreamHasBytesAvailable: yes");
    else
        NSLog(@"CFReadStreamHasBytesAvailable: no");
}];
但结果总是
YES

我还尝试在发送读取请求后调用方法
ProgressOfReturningTag:bytesDone:total:
,当读取完成时,它似乎总是返回1,否则返回零,但我不确定以这种方式使用该方法是否可靠


也许有人可以告诉我,在这种情况下,
progressofrepreningtag:…
是否确实可靠,或者,如果不可靠,请为我指出另一个解决方法。

您需要在协议层上定义“流结束”。例如,您可能需要定义一个
EOS
字符(可能
EOS
等于0x00)。如果发送方检测到“数据结束”,它将发送
EOS
字符,接收方将检测到这一点。请注意,
EOS
在二进制流中不起作用。在二进制流中,发送方可能会关闭流以指示EOS,或者——再一次——它是在“协议”层上定义的,需要发送“结构化”数据,其中可以发出“消息结束”的信号。@CouchDeveloper:谢谢提示,不幸的是,它不是我的服务器,所以我无法更改协议。希望有另一种方法可以解决这个问题。如果您的数据流有一个结构,您可能会检测到“消息结束”。例如,如果您传输JSON,那么在JSON完成时解析器可以检测到它:
[“一”“二”,false]
@CouchDeveloper:再次感谢,但不幸的是,没有这样的结构,每一行都是独立的,并且没有指示下一行或之前的内容。这在这方面是非常基本的。那么,你的数据是“无限”的,你永远不会得到EOS:)你可以在获得足够的信息后开始行动,例如在收到一个完整的“字符串”并由CRLF终止后,来缓解这个“问题”。(想想“聊天系统”)