我有一个使用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/