我正在将一个App从Objective-C移植到Swift,我需要使用以下方法:
CFStreamCreatePairWithSocketToHost(alloc: CFAllocator!, host: CFString!, port: UInt32, \ readStream: CMutablePointer?>, \ writeStream: CMutablePointer ?>)
旧的逻辑看起来像这样(几个网站似乎都同意):
CFReadStreamRef readStream = NULL; CFWriteStreamRef writeStream = NULL; CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)(host), port, \ &readStream, &writeStream); NSInputStream inputStream = (__bridge_transfer NSInputStream *)readStream; NSOutputStream outputStream = (__bridge_transfer NSOutputStream *)writeStream;
由于免费桥接,这很好用.但是,ARC在"Swift-space"中不存在,并且类型系统已经改变.
如何将我的流变成实例
CMutablePointer?>, and CMutablePointer ?>
然后NSStream
在CFStreamCreatePairWithSocketToHost
调用之后将它们转换回子类?
我得到了它的工作,这是我的代码:确保你在某处保留连接类的引用:-)
class Connection : NSObject, NSStreamDelegate { let serverAddress: CFString = "127.0.0.1" let serverPort: UInt32 = 8443 private var inputStream: NSInputStream! private var outputStream: NSOutputStream! func connect() { println("connecting...") var readStream: Unmanaged<CFReadStream>? var writeStream: Unmanaged<CFWriteStream>? CFStreamCreatePairWithSocketToHost(nil, self.serverAddress, self.serverPort, &readStream, &writeStream) // Documentation suggests readStream and writeStream can be assumed to // be non-nil. If you believe otherwise, you can test if either is nil // and implement whatever error-handling you wish. self.inputStream = readStream!.takeRetainedValue() self.outputStream = writeStream!.takeRetainedValue() self.inputStream.delegate = self self.outputStream.delegate = self self.inputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode) self.outputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode) self.inputStream.open() self.outputStream.open() } func stream(stream: NSStream, handleEvent eventCode: NSStreamEvent) { println("stream event") } }
我无法得到其他人在此主题中提供的示例.当然,他们编译了,但是一旦连接打开就会崩溃.
但是,我在WWDC 2014讨论(和iOS 8发行说明)中注意到,有一种新方法可以初始化NSStream以创建一对绑定的输入/输出流.
见下文:
var inputStream: NSInputStream? var outputStream: NSOutputStream? NSStream.getStreamsToHostWithName("localhost", port: 1234, inputStream: &inputStream, outputStream: &outputStream)
这消除了对笨拙的CFStreamCreatePairWithSocketToHost调用的需要,并消除了对非托管资源的需求.