gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:26:47 24 4
gpt4 key购买 nike

我一直在使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com