我的iOS应用使用GCDAsyncSocket从服务器接收数据。服务器每分钟收集一次外部数据。该应用程序定期连接到服务器,并接收此数据。服务器会跟踪已发送的内容,因此每分钟的数据只会发送一次。服务器只保留最后一小时的数据。每分钟的数据都是一个大约100个字节(+/- 20个字节)的字符串。
收到字符串,分成几分钟,每分钟分成每分钟数据中的各种数量。
如果应用程序未连接服务器超过一小时,该应用程序将下载60分钟的数据。发生这种情况时,我只得到大约15分钟的数据。我跟踪了这个事实,即readDataWithTimeout方法只在readQueue上加载一个数据包,这限制了我1460个字节。我发现当我向队列添加第二个数据包时,我得到另外1460个字节的数据。如果字符串是它们的最大长度,并且我正在下载60个字符串,那么5个数据包将足以捕获所有内容。
另一个问题是数据包数据字符串的最后一分钟将不可避免地分成两个数据包。我想要做的是收集所有数据包的NSData实例,将它们连接成一个大型NSData实例,将其转换为字符串,并正常解析该字符串。
此应用已针对Android发布。因此,如果可能的话,我想避免更改服务器和Android代码以适应iOS版本。
答案 0 :(得分:1)
每次我请求读取时,我最终只向readQueue添加了5个数据包,并为读取添加了一个超时,以便队列不会溢出。我还设置了一个NSTimer,在didReadData回调结束后2秒后触发。当计时器过去时,假设已读取所有可用数据,并处理字符串。每个计时器都使用相同的NSTimer实例,因此如果计时器处于活动状态,并且发生了另一个didReadData事件,则会启动一个新计时器,从而消除旧计时器。