CFStreamCreateBoundPair 正在将 4kb 数据写入流,流将解析包含 xml 起始节点且不包含结束节点的数据
Posted
技术标签:
【中文标题】CFStreamCreateBoundPair 正在将 4kb 数据写入流,流将解析包含 xml 起始节点且不包含结束节点的数据【英文标题】:CFStreamCreateBoundPair is writing 4kb data to stream and stream will parse the data which contains start node of xml and it doesnt contain end node 【发布时间】:2013-02-06 13:46:13 【问题描述】:。如何编写代码和管理代码,以便我们将正确的 xml 数据写入 nsoutputstream。
CFStreamCreateBoundPair(NULL, (CFReadStreamRef *)&iStream, (CFWriteStreamRef *)&oStream,4096);
【问题讨论】:
您是否使用 5.0 版之前的 ios?如果是这样,此网址上CFStreamCreateBoundPairCompat()
附近的评论可能会引起您的兴趣:developer.apple.com/library/ios/#samplecode/…
苹果给出的代码中不包含管理xml节点。
这无关紧要。 CFStreams 不关心 XML。这对他们来说都是“字节”。我试着回答你的问题。希望它有所帮助。
我尝试了相同的代码。它仍然给出 绑定流对的工作方式是,您可以将块写入写入流,而其他内容可以从读取流中读取块。您已在此处将 transferBufferSize
设置为 4096。这表明数据将以 4096 字节 (4K) 的块从写入流移动到读取流。如果您的源数据大于 4K 但长度小于 8K,那就可以解释为什么您只得到它的前 4K。例如,如果您的数据长 6K,那么前 4K 将被发送到读取流,然后下一个 2K 将排队,但我的理解是它会在缓冲区中等待,直到发生以下两种情况之一:
-
到达的数据足以完成第二个 4K 块。
写入流已关闭。
因此,如果 6K 是您要写入写入流的全部内容,那么您需要使用 CFWriteStreamClose(oStream);
关闭写入流,以便将最后的 2K 发送到读取流。否则,我的期望是它会永远坐在那里。
【讨论】:
我在 do while 循环中写入 o/p 流.. 你在说什么? dobytesWritten = [oStream write:(const uint8_t *)[self.m_cWebData bytes] maxLength:dataLength - bytesWrittenSoFar]; NSLog(@"Rcvd Data=%d 写入 = %d",[self.m_cWebData length],bytesWritten);[self.m_cWebData replaceBytesInRange:NSMakeRange(0,bytesWritten) withBytes:"" length:0];NSLog(@"重置后的 Rcvd 数据 =%d ",[self.m_cWebData length]);assert(bytesWritten != 0);if (bytesWritten != -1) 我将写入流 stream:(NSStream *)s handleEvent: hasspaceavailable 也在调用 writetostream 方法 我认为您误解了这个问题。我已将所有服务器数据保存到 nsmutabledata 中。但我只写入了 4kb 的数据流。 你不能在这样的 do/while 循环中使用 CFStreams。他们依赖运行循环来运行,只要你在你的 do/while 循环中,它就不会运行。此外,如果您已经在内存中拥有所有数据,只需在一次调用中将其全部写入流;在这一点上,尝试将其分块几乎没有优势。您可能应该阅读 CFStreams、NSRunLoops 以及它们如何协同工作。以上是关于CFStreamCreateBoundPair 正在将 4kb 数据写入流,流将解析包含 xml 起始节点且不包含结束节点的数据的主要内容,如果未能解决你的问题,请参考以下文章