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
情况下这样做吗?应该何时使用哪种方法?
答案 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中描述的NSURLRequest
和NSURLConnection
个对象。