首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >排队进入NSInputStream?

排队进入NSInputStream?
EN

Stack Overflow用户
提问于 2013-03-05 23:28:08
回答 1查看 639关注 0票数 11

我想在NSInputStream中添加三个“部件”:一个NSString,一个来自另一个流的输出,然后是另一个NSString。其想法如下:

第一个也是最后一个NSStrings表示SOAP请求的开始和结束,而流的输出是加载一个非常大的文件并将其编码为Base64字符串的结果。因此,最后,我将让最后的NSInputStream保存整个SOAP请求,如下所示:

< soap开始>< Base64编码数据>< soap结束>

我希望将整个请求保存在NSInputStream中的原因有两方面:

  1. 我不知道如何将这个非常大的数据文件加载到内存中
  2. 我认为这是在HTTP1.1块中强制发送最终请求的唯一方法(我需要这样做,因为否则,如果请求变得太大,服务器就不会接受它)。所以,我知道这样做 NSInputStream *dataStream =.;请求setHTTPBodyStream:dataStream;

确保请求将作为HTTP1.1块发送,而不是作为一个庞大的原始SOAP请求发送。

因此,我想知道如何实现这一点--也就是说,我如何将事情“排队”到一个NSInputStream中?甚至可以完成吗?还有别的办法吗?

仅供参考,在Java中,这可以如下所示

代码语言:javascript
复制
 Vector<InputStream> streamVec = new Vector<InputStream>();
 BufferedInputStream fStream = new BufferedInputStream(fileData.getInputStream());
 Base64InputStream b64stream = new Base64InputStream(fStream, true);
 String[] SOAPBody = GenerateSOAPBody(fileInfo).split("CUT_HERE");  
 streamVec.add(new ByteArrayInputStream(SOAPBody[0].getBytes()));
 streamVec.add(b64stream);
 streamVec.add(new ByteArrayInputStream(SOAPBody[1].getBytes()));
 SequenceInputStream seqStream = new SequenceInputStream(streamVec.elements());

因为Java有这些对象可用,但是objects中的NSStreams看起来像非常低级别的对象,很难使用。

注意:我在两天前问的时候完全重写了原来的问题,因为我认为新的编辑更清楚地解释了问题的所在。我希望它能帮助我们更容易地理解和回答

更新2

到目前为止,我已经实现了以下目标:我没有尝试将队列放入流中,而是首先使用临时文件来编写< soap same >,然后设置一个输入流以块形式从文件中读取,将每个块编码为一个Base64字符串并将其写入相同的临时文件,最后,当我的流关闭时,我会将< soap and >写入该temp文件。然后,我用这个文件的内容设置了另一个输入流,并将其传递给NSMutableURLRequest:

代码语言:javascript
复制
        NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url];
        ...
        NSInputStream *dataStream = [NSInputStream inputStreamWithFileAtPath:_tempFilePath];
        [request setHTTPBodyStream:dataStream];

这确保了HTTP1.1块传输文件的内容。连接完成后,删除临时文件。

这似乎很好,但当然这是一个恼人的工作-关于。我不想写到一个临时文件,而这一切都可以由流处理(理想情况下)。如果还有人有更好的建议,请告诉我:)

更新3

好的,另一个更新是有序的。虽然我的文件写作似乎有效,但我现在遇到了一个意外的问题,因为我的一些请求未能上传到服务器。具体来说,一切都是按照计划进行的,我正在将临时文件的内容读入流中,并将请求的HTTP主体设置为此流,它开始按我的意愿发送HTTP1.1块--但由于某种原因,一些数据包被丢弃,最后的请求(这是我的猜测)出现了错误,因此失败了。我认为丢包的问题是随机的,因为我在较大的请求上观察到了它--也就是说,这个问题只是有更多的机会出现--而我的小请求通常处理得很好。这当然是一个独立的问题,而不是原来的问题。如果有人对造成这种情况的原因有很好的了解,我在这里问到了问题:在NSURLConnection发送的块HTTP1.1请求中丢弃的数据包

EN

回答 1

Stack Overflow用户

发布于 2016-07-05 21:26:08

您的解决方案是一个ok选项,但是您可以使用一个流来完成它。这意味着对NSInputStream进行子类化,这并不简单,因为您需要实现许多方法。

基本上,您的子类最初将返回页眉字节,然后将字节从“内部”流返回到文件内容,然后在用完时返回页脚字节。这意味着要记录页眉和页脚的大小以及到目前为止处理了多少,但这不是什么大问题。

有一个创建子类这里的示例,它展示了需要实现的复杂隐藏方法,以使流子类能够正常工作,而不会引发异常。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15236133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档