我一直在使用NSURLConnection进行HTTP发布以建立连接。我还实现了didReceiveData委托来处理传入的字节(当它们可用时)。

当传入的数据通过didReceiveData传入时,我将NSData添加到数据缓冲区中,如果有足够的数据来完成消息段,则尝试解析bytesteam。我很难管理数据缓冲区(NSMutableData对象)以删除已解析为结构的字节。好奇是否有更简单的方法。我的didReceiveData委托如下。

它可以工作,但是在我从responseData缓冲区复制消息段(currMsg)并调用processMsg之后,我认为我无法正确管理内存。在模拟器下运行时,我得到双重免费错误-该程序不会崩溃。

NSMutableData / NSData提供了将字节追加到末尾的方法,但我没有看到任何从开头删除字节的方法(表示已解析内容的字节。关于如何最好地从responseData缓冲区中删除已解析的字节的建议,我将不胜感激。我来自大多数C语言的背景,所以我不确定是否有更好的方法来操纵NSData字节指针。如果可能的话,我想避免复制-只想处理一部分responseData缓冲区并留下下一次在responseData中休息一下,其中有足够的字节用于解析。

谢谢

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { ojit_pre

}

最佳答案

您在哪里分配第一个responseData?

[self processMsg:currMsg]对数据做什么?如果期望数据在-processMsg:返回之后存在,并且没有显式创建副本,那么您会遇到麻烦。

实际上,除非您在didReceiveData:返回之前完成了接收到的数据,否则您需要在某个地方制作它的副本,这在所示的代码中不可见。

您需要为tempBuffer分配存储空间,而不要传递未初始化的指针。

您可能应该寻找简单的环形缓冲区的预卷实现。周围有很多。

关于iphone - 在iPhone/Cocoa环境中打开与HTTP服务器的流连接?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2924559/

10-09 08:52