如何在objective-c中将数据从NSOutputStream传输到NSInputStream

Posted

技术标签:

【中文标题】如何在objective-c中将数据从NSOutputStream传输到NSInputStream【英文标题】:how to pipe data from NSOutputStream to NSInputStream in objective-c 【发布时间】:2015-01-30 19:03:21 【问题描述】:

我有 2 个库要集成并让它们相互通信。他们每个人都监听自己的输入和输出流。 库 1 将是库 2 的传输层。

案例 1: 库 1 在其输入流上接收数据我想在另一个虚拟输出流上写入数据,该输出流将通过管道传输到库 2 上的输入流。

案例 2: 库 2 想要发送一些数据,因此它将数据写入其输出流。这应该通过管道传送到一个虚拟输入流,从中读取数据并将其写入库 1 的输出流。

如何在 Objective-c 中为这些 NSStreams 创建管道?

提前感谢您的意见。

【问题讨论】:

子类都带有包装类。一个截取数据并将其排队,另一个从队列中提取。 Sharath 运气好吗?我一直在寻求做类似的事情。 我的情况是,两个库都独立处理流事件。我写了一个桥接类:我制作了桥接,这样当在库 1 上接收到数据时,它会获取 NSData 并使用 [NSInputStream inputStreamWithData:data] 创建一个输入流,并将其作为库 2 的输入流。要发送的数据我直接在库 2 输出流上发送数据,通过流事件在桥中收集它并写入库 1 输出流 【参考方案1】:

Gabriele Mondada 回答的 Swift 版本

    var readStream:Unmanaged<CFReadStream>?
    var writeStream:Unmanaged<CFWriteStream>?

    CFStreamCreateBoundPair(nil, &readStream, &writeStream, 4096)

    let inputStream:NSInputStream = readStream!.takeRetainedValue()
    let outputStream:NSOutputStream = writeStream!.takeRetainedValue()

【讨论】:

另见***.com/questions/24028995/…【参考方案2】:

以下是创建简单管道的方法:

CFReadStreamRef readStream = NULL;
CFWriteStreamRef writeStream = NULL;

CFStreamCreateBoundPair(NULL, &readStream, &writeStream, 4096);

NSInputStream *inputStream = (__bridge_transfer NSInputStream *)readStream;
NSOutputStream *outputStream = (__bridge_transfer NSOutputStream *)writeStream;

您写入 outputStream 的内容将从 inputStream 中读取。

【讨论】:

这太糟糕了。谁需要这样的一对?通常你有两个与某些东西相关联的流:文件、套接字、内存、xml 解析器,所以准备好的套接字应该通过管道连接在一起。 我需要它。谢谢。另请参阅我对 Swift 版本的回答 @MarekR 说我有一些数据来源。我给它传递了一个OutputStream 来写信。我想将这些数据上传到服务器; HTTP 库采用InputStream。所以我需要的只是两个流之间的桥梁。 @Raphael 你错过了我的意思,你必须做很多样板代码,才能将一个流提供给另一个流。这对仅在一种情况下有用,用于在线程之间传递数据(每个流调度在不同的事件循环上),在其他情况下它完全没用。

以上是关于如何在objective-c中将数据从NSOutputStream传输到NSInputStream的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Objective-c 中将 NSDictionary 表示为文字?

如何在objective-c中将字节值转换为int

在objective-c中将api响应插入核心数据时逐渐增加内存

如何在 Objective-C 中将字符串转换为整数? [复制]

如何在 Objective-C 中将 int 转换为字节?

如何在 Objective-C 中将值附加到数组