gpt4 book ai didi

ios - 排队进入 NSInputStream?

转载 作者:可可西里 更新时间:2023-11-01 03:00:51 25 4
gpt4 key购买 nike

我想向 NSInputStream 添加三个“部分”:一个 NSString,另一个流的输出,然后是另一个 NSString。思路如下:

第一个和最后一个 NSString 代表 SOAP 请求的开始和结束,而流的输出是加载一个非常大的文件并将其编码为 Base64 字符串的结果。所以,最后我会让最终的 NSInputStream 像这样保存整个 SOAP 请求:

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

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

    NSInputStream *dataStream = ....; 
    [request setHTTPBodyStream:dataStream];

确保请求将作为 HTTP 1.1 block 发送,而不是作为一个巨大的原始 SOAP 请求发送。

所以,我想知道这是如何实现的——也就是说,我如何将事物“排队”到 NSInputStream 中?甚至可以做到吗?有替代方法吗?

仅供引用,在Java中可以这样实现

 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 有这些对象可用,但 Objective-c 中的 NSStreams 看起来像非常低级的对象并且很难使用。

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

更新 2

这是我到目前为止能够实现的:我没有尝试排队到流中,而是使用临时文件首先写入 ,然后我设置了一个输入流以从中读取将文件分 block ,将每个 block 编码为 Base64 字符串并将其写入同一个临时文件,最后,当我的流关闭时,我将 写入临时文件。然后我用我传递给 NSMutableURLRequest 的这个文件的内容设置另一个输入流:

        NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url];
...
NSInputStream *dataStream = [NSInputStream inputStreamWithFileAtPath:_tempFilePath];
[request setHTTPBodyStream:dataStream];

这确保了文件内容的 HTTP 1.1 分 block 传输。连接完成后,删除临时文件。

这似乎工作正常,但当然这是一个烦人的工作。我不想写入一个临时文件,因为它本来可以由流处理(理想情况下)。如果有人还有更好的建议,请告诉我:)

更新 3

好的,另一个更新是有序的。虽然我的文件写入似乎有效,但我现在遇到了一个意想不到的问题,我的一些请求无法上传到服务器。具体来说,一切都按计划进行,我正在将临时文件的内容读入一个流并将我请求的 HTTP 主体设置为这个流,它开始按照我的意愿传输 HTTP 1.1 block ——但对于一些一些数据包被丢弃的原因,最终请求——这是我的猜测——格式错误,因此失败。我认为丢弃数据包的问题是随机的,因为我在较大的请求中观察到它——也就是说,这个问题更有可能出现——而我的较小请求通常会顺利通过。在这个问题中,这当然是与原始问题不同的问题。如果有人知道是什么原因造成的,我在这里询问了这个问题:Packets dropped during chunked HTTP 1.1 request sent by NSURLConnection

最佳答案

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

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

有一个创建子类的例子 here它显示了您需要实现的棘手的隐藏方法,以使流子类正常工作而不抛出异常。

关于ios - 排队进入 NSInputStream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15236133/

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