iphone - 在 iPhone/Cocoa 环境中打开到 HTTP 服务器的流连接?

标签 iphone cocoa xcode

我一直在使用 NSURLConnection 执行 HTTP post 来建立连接。我还实现了 didReceiveData 委托(delegate)来处理可用的传入字节。

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

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

NSMutableData/NSData 提供了将字节附加到末尾的方法,但我没有看到任何从开头删除字节的方法(代表已解析内容的字节。我将不胜感激一些关于如何最好地删除已解析字节的建议响应数据缓冲区。我主要来自 C 背景,所以我不确定是否有更好的方法来操作 NSData 字节指针。如果可能的话,我想避免复制——只想处理响应数据缓冲区的一部分并将其余部分保留在responseData中,以便下次有足够的字节进行解析。

谢谢

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

<pre><code>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; } </code></pre> <p>}</p>

最佳答案

你在哪里分配第一个responseData?

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

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

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

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

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

相关文章:

ios - 使用自定义 getter 和 setter 通过 ARC 发送消息到已释放实例

ios - 抑制 "incompatible pointer types sending ' subclassA' 为类型 'subclassB' 的参数“clang

iphone - drupal-ios-sdk 与 iPhone 应用程序集成时出现问题

iphone - Interface Builder Outlet 的内存管理

iphone - 如何将 NSString 转换为 NSData?并且数据与字符串内容相同

ios - 使用具有外部 cocoa pod 依赖项的 Swift 创建静态库

objective-c - 按列标题对表格进行排序并保持 NSArrayController 同步

iphone - 全局变量调用仅在第一次有效

ios - 无法在 QT 项目中添加 iOS OpenCV 框架

ios - 如何在多个 UIView 中使用一个函数