gpt4 book ai didi

objective-c - CFReadStreamRef 与 NSInputStream *

转载 作者:行者123 更新时间:2023-11-29 11:13:08 25 4
gpt4 key购买 nike

NSInputStream *CFReadStreamRef 之间的区别似乎是第一个是 Objective-C 对象,而第二个是 native 结构。不过,它们是免费桥接的。

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

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

最佳答案

一般来说,大多数 Foundation/CoreFoundation 免费桥接类在行为方面也是相似的。但是你是对的,NSInputStream *CFReadStreamRef 不是这种情况。苹果的Setting Up Socket Streams指南仅解释您所描述的内容。即使使用最新的初始化程序(如 10.6 中可用的 inputStreamWithURL:),当 url 是远程的(例如 http://...)。

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

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

作为所有这些的替代方案,我建议看一下 URL Loading System Programming Guide 中描述的 NSURLRequestNSURLConnection 对象.

关于objective-c - CFReadStreamRef 与 NSInputStream *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10600638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com