CFReadStreamRef与NSInputStream *

时间:2012-05-15 12:27:06

标签: objective-c ios stream nsstream cfstream

NSInputStream *CFReadStreamRef之间的区别似乎是第一个是客观C对象,而第二个是本机结构。然而,他们是无人值守的桥梁。

我想基于网络流实现一个程序。

  • [NSStream getStreamsToHost:port:inputStream:outputStream:]生成NSInputStream *NSOutputStream *。但是,在iOS上,此方法不可用。

    因此,必须在iOS上使用CFStreamCreatePairWithSocketToHost

    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    CFStreamCreatePairWithSocketToHost(
                     kCFAllocatorDefault, host, port, &readStream, &writeStream);
    NSInputStream *read = (__bridge NSInputStream *)readStream;
    NSOutputStream *write = (__bridge NSOutputStream *)writeStream;
    
  • 设置流属性时,使用NSInputStream *时并非所有属性都可用。特别是kCFStreamPropertyShouldCloseNativeSocket会很有趣,以确保在关闭相应的流时套接字也会关闭。

    我是否必须将NSInputStream *转换为CFReadStreamRef以设置此属性,然后还原转换,以设置此类属性?

  • ...

NSInputStream *似乎有许多缺点。它唯一的优势是我可以提供它自己的子类,而我不能在CFReadStreamRef情况下这样做吗?应该何时使用哪种方法?

1 个答案:

答案 0 :(得分:2)

通常,大多数Foundation / CoreFoundation免费桥接类在行为方面也类似。但你是对的,NSInputStream *CFReadStreamRef不是这种情况。 Apple的Setting Up Socket Streams指南仅解释您所描述的内容。即使使用最新的初始值设定项(如10.6中提供的inputStreamWithURL:),当url为远程时(例如http://...),它仍然不起作用。

我看到继续使用NSInputStream的主要优点是在Objective-C应用程序中更好的集成。您可以随时尝试更改NSInputStream *对象(读取)的属性,如下所示:

if (!CFReadStreamSetProperty((CFReadStreamRef)read,
                              kCFStreamPropertyShouldCloseNativeSocket,
                              kCFBooleanTrue))
     failure("property change not accepted");

作为所有这一切的替代方案,我建议您查看URL Loading System Programming Guide中描述的NSURLRequestNSURLConnection个对象。