在iPhone/Cocoa环境上打开到HTTP服务器的流式连接?

在iPhone/Cocoa环境上打开到HTTP服务器的流式连接?,iphone,cocoa,xcode,Iphone,Cocoa,Xcode,我一直在使用NSURLConnection进行HTTP post以建立连接。我还实现了didReceiveData委托,以便在传入字节可用时对其进行处理 由于传入数据是通过didReceiveData传入的,因此我将NSData添加到数据缓冲区中,并尝试解析bytesteam(如果传入的数据足够完成一个消息段)。我很难管理数据缓冲区(NSMutableData对象),以删除已解析为结构的字节。我很好奇是否有更简单的方法。下面是我的didReceiveData委托 它可以工作,但在我从respon

我一直在使用NSURLConnection进行HTTP post以建立连接。我还实现了didReceiveData委托,以便在传入字节可用时对其进行处理

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

它可以工作,但在我从responseData缓冲区复制消息段(currMsg)并调用processMsg后,我认为我没有正确管理内存。在模拟器下运行时,我得到了双重自由错误——程序不会崩溃

NSMutableData/NSData提供了将字节追加到末尾的方法,但我没有看到任何从开头删除字节的方法(表示已解析内容的字节。我希望得到一些关于如何最好地从responseData缓冲区中删除已解析字节的建议。我主要来自C背景,因此我不确定是否有更好的方法来操作NSData bytes指针。如果可能的话,我希望避免复制--只希望处理Response的一部分创建一个缓冲区,并将其余部分保留在responseData中,以便下次有足够的字节用于解析

谢谢


-(void)连接:(NSURLConnection*)连接didReceiveData:(NSData*)数据{

}


您在哪里分配第一个响应数据

[self-processMsg:currMsg]对数据做了什么?如果它期望数据在-processMsg:returns之后出现,并且它没有显式地进行复制,那么您就有麻烦了

事实上,除非您在didReceiveData:返回之前已经完成了接收的数据,否则您需要在某个地方复制它,这在显示的代码中是不可见的

您需要为tempBuffer分配存储,而不是传入未初始化的指针


您可能应该寻找一个简单环形缓冲区的预卷实现。有很多解决方案。

我不能提供替代解决方案,但我过去也做过同样的事情。您能否澄清您的问题以包括您遇到的特定问题?谢谢您的回答。因此,我添加了我的didReceiveData方法如上面所示,还有更多信息需要澄清。NSRange rangeToDelete={0,sizeof(int)};[incomingDataBuffer replaceBytesInRange:rangeToDelete with bytes:NULL length:0];
NSData *tmpBuffer = nil;
NSInteger currMsgSize = 10;

[responseData appendData:data];
NSInteger rspDataLen = [responseData length];

while(rspDataLen >= 10) {

    currMsg = [[NSData alloc] initWithBytesNoCopy:(void *)[responseData bytes] length:currMsgSize];

    [self processMsg:currMsg];

    [currMsg release];
    [responseData getBytes:tmpBuffer range:NSMakeRange(currMsgSize, rspDataLen - currMsgSize)];
    [responseData release];
    responseData = [[NSMutableData alloc] initWithBytesNoCopy:(void *)tmpBuffer length:rspDataLen - currMsgSize];
    rspDataLen = rspDataLen - currMsgSize;
}