我有一个使用NSInputStream作为参数的消费者类,它将被异步处理,并且我想推送来自生产者类的数据,该生产者类要求提供NSOutputStream作为其输出源。现在如何设置缓冲(或透明)流作为生产者的输出流,并同时为我的消费者类的NSInputStream呢?

我看了一下NSOutputStream + outputStreamToMemory和+ outputStreamToBuffer:capacity :,但还没有真正弄清楚如何将其用作NSInputSource的输入。

我曾想过要建立一个中间人类来保存实际的缓冲区,然后创建两个子类(每个NSInput / OutputStream一个子类)来保存对该缓冲类的引用,然后让这些子类将大多数调用委托给该类,例如,输出子类方法hasSpaceAvailable,write:maxLength :,对于输入,hasBytesAvailable,read:maxLength:等。

任何有关如何解决这种情况的技巧,我们将不胜感激。谢谢。

最佳答案

一种实现方法是使用apple开发人员站点上的示例代码。
SimpleURLConnection example

如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


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

关于iphone - 缓冲NSOutputStream用作NSInputStream吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3221030/

10-14 21:57