缓冲用作NSInputStream的NSOutputStream?

我有这个使用NSInputStream作为参数的消费者类将被处理异步,我想推动来自生产者类的数据,它需要它提供一个NSOutputStream作为其输出源。 现在我怎么能设置一个缓冲(或透明)流作为生产者的输出流,同时又是我的消费者类的NSInputStream?

我看了一下NSOutputStream + outputStreamToMemory和+ outputStreamToBuffer:capacity:但还没有真正想出如何将它用作NSInputSource的输入。

我有一些设想保留实际缓冲区的中间人类的想法,然后为这个缓冲类创建两个子类(每个NSInput / OutputStream一个),并让这些子类将大多数调用委托给该类,例如,输出子类的方法hasSpaceAvailable,写:maxLength :,并且对于输入,hasBytesAvailable,读:maxLength:等等

有关如何处理这种情况的任何提示,都表示赞赏。 谢谢。


一种方法是使用苹果开发者网站上的示例代码。 SimpleURLConnection示例

这是如何做到的,正如PostController.m代码中所见

@interface NSStream (BoundPairAdditions)
+ (void)createBoundInputStream:(NSInputStream **)inputStreamPtr outputStream:(NSOutputStream **)outputStreamPtr bufferSize:(NSUInteger)bufferSize;
@end

@implementation NSStream (BoundPairAdditions)

+ (void)createBoundInputStream:(NSInputStream **)inputStreamPtr outputStream:(NSOutputStream **)outputStreamPtr bufferSize:(NSUInteger)bufferSize
{
    CFReadStreamRef     readStream;
    CFWriteStreamRef    writeStream;

    assert( (inputStreamPtr != NULL) || (outputStreamPtr != NULL) );

    readStream = NULL;
    writeStream = NULL;

    CFStreamCreateBoundPair(
        NULL, 
        ((inputStreamPtr  != nil) ? &readStream : NULL),
        ((outputStreamPtr != nil) ? &writeStream : NULL), 
        (CFIndex) bufferSize);

    if (inputStreamPtr != NULL) {
        *inputStreamPtr  = [NSMakeCollectable(readStream) autorelease];
    }
    if (outputStreamPtr != NULL) {
        *outputStreamPtr = [NSMakeCollectable(writeStream) autorelease];
    }
}
@end

基本上你可以将两个流的末端与一个缓冲区连接在一起。


您可能需要考虑子类化NSInputStream,并将源流包装到您的新类中,以缓冲和/或修改它们通过时的字节。

我发现通过绑定套接字方法来做这件事的主要原因是支持寻找。 基于文件的NSInputStreams使用流属性在文件中搜索,并且我无法轻松地在没有子类的情况下安排它。

这种方法的一个问题是,看起来免费的桥接不适合你的子类 - 但是有一篇非常不错的文章,如果你需要的话,它也会给你一个模板子类,从头开始:

http://bjhomer.blogspot.co.uk/2011/04/subclassing-nsinputstream.html

我有一个使用这两种方法的缓冲解决方案 - 尽管我在子类方法中遇到的另一个问题是,您需要注意将事件正确地发送给侦听器 - 例如,当源流向您发送EOF事件时,您不会把它传递给你的消费者,直到他们清空了缓冲区 - 所以这里有一些乱七八糟的事情要做。

此外,您可能需要确保客户端从主运行循环中读取数据(因为您在子类中进行的任何观察 - 源数据流)都会与消费者发生冲突。 尽管您似乎可以选择任何运行循环来观察流,但只有主循环才起作用。

总的来说,我会说,除非你需要支持寻找 - 或者对配对码流方法特别反感,否则与配对的码流一起去吧。


这是一个已经实现的类,它完全符合你的需求

BufferOutputStreamToInputStream

// initialize
self.bufferWriter = [[BufferOutputStreamToInputStream alloc] init];
[self.bufferWriter openOutputStream];

// later you want to set the delegate of the inputStream and shedule it in runloop
// remember, you are responsible for the inputStream, the outputStream is taken care off;)
self.bufferWriter.inputStream.delegate = self;
[self.bufferWriter.inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[self.bufferWriter.inputStream open]

// fill with data when desired on some event      
[self.bufferWriter addDataToBuffer:someData];
链接地址: http://www.djcxy.com/p/96711.html

上一篇: Buffering NSOutputStream used as NSInputStream?

下一篇: Difference between in signed and unsigned char in c