CFReadStreamRef vs. NSInputStream *



NSInputStream *CFReadStreamRef之间的区别似乎是第一个是客观的C对象,而第二个是本机结构。尽管如此,它们还是免费桥接的。

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

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

    因此,CFStreamCreatePairWithSocketToHost必须在iOS上使用。

    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情况下我不能这样做吗?什么时候应该使用哪种方法?

一般来说,大多数基金会/核心基金会免费桥接类在行为方面也是相似的。但你是对的,NSInputStream *CFReadStreamRef的情况并非如此.Apple 的设置套接字流指南仅解释了您所描述的内容。即使使用最新的初始值设定项(如 10.6 中可用的inputStreamWithURL:(,当url是远程的(例如。 http://... (。

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

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

作为所有这些的替代方案,我建议查看 URL 加载系统编程指南中描述的NSURLRequestNSURLConnection对象。

相关内容

  • 没有找到相关文章