带有 HTTPBody 输入流的 NSURLRequest:流在打开之前发送事件

发布于 2024-09-12 15:07:46 字数 600 浏览 7 评论 0原文

我想使用 NSURLConnection (和 NSURLRequest)向服务器发送大量数据。为此,我创建了一对绑定的 NSStream(使用 CFStreamCreateBoundPair(...))。然后,我将输入流传递给 NSURLRequest (-setHTTPBodyStream:) 并在当前运行循环上安排输出流。当运行循环继续时,我获取发送数据的事件,并且输入流将此数据发送到服务器。

我的问题是,只有当数据适合成对流之间的缓冲区时,这才有效。如果数据较大,则输入流会以某种方式获取事件(我假设“字节可用”),但 NSURLConnection 尚未打开输入流。这会导致打印错误消息并且不会发送数据。

我试图在我的 -stream:handleEvent: 方法中捕获这个问题,方法是简单地返回输入流尚未打开的情况,但随后我的输出流会收到一个流关闭事件(可能是因为我从未在我可以)。

所以我的问题是:如何正确使用 NSURLConnection 的绑定流对?

(如果这很重要:我正在 iOS 平台上开发)

任何帮助将不胜感激!

干杯,马库斯

I want to send a large amount of data to a server using NSURLConnection (and NSURLRequest). For this I create a bound pair of NSStreams (using CFStreamCreateBoundPair(...)). Then I pass the input stream to the NSURLRequest (-setHTTPBodyStream:) and schedule the output stream on the current run loop. When the run loop continues, I get the events to send data and the input stream sends this data to the server.

My problem is, that this only works when the data fits into the buffer between the paired streams. If the data is bigger, then somehow the input stream gets an event (I assume "bytes available") but the NSURLConnection has not yet opened the input stream. This results in an error message printed and the data is not being sent.

I tried to catch this in my -stream:handleEvent: method by simply returning if the input stream is not yet opened, but then my output stream gets a stream closed event (probably because I never sent data when I could).

So my question is: How to use a bound pair of streams with NSURLConnection correctly?

(If this matters: I'm developing on the iOS platform)

Any help is appreciated!

Cheers, Markus

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

一身软味 2024-09-19 15:07:46

好的,我通过延迟启动上传来修复此问题,以便在 NSURLConnection 有时间设置其输入流之后启动。

但这不是我所说的干净的解决方案,因为依赖 -performSelector:withObject:afterDelay: 似乎有点老套。

因此,如果其他人有解决方案,我仍然愿意接受任何建议。

Ok, I kind of fixed this by starting the upload delayed, so that it starts after the NSURLConnection had time to setup its input stream.

It's not what I call a clean solution though, since relying on -performSelector:withObject:afterDelay: seems a bit hacky.

So if anyone else has a solution to this, I'm still open for any suggestions.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文