Eph*_*era 23 objective-c core-foundation toll-free-bridging swift
我正在将一个App从Objective-C移植到Swift,我需要使用以下方法:
CFStreamCreatePairWithSocketToHost(alloc: CFAllocator!, host: CFString!, port: UInt32, \
readStream: CMutablePointer<Unmanaged<CFReadStream>?>, \
writeStream: CMutablePointer<Unmanaged<CFWriteStream>?>)
Run Code Online (Sandbox Code Playgroud)
旧的逻辑看起来像这样(几个网站似乎都同意):
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;
Run Code Online (Sandbox Code Playgroud)
由于免费桥接,这很好用.但是,ARC在"Swift-space"中不存在,并且类型系统已经改变.
如何将我的流变成实例
CMutablePointer<Unmanaged<CFReadStream>?>, and
CMutablePointer<Unmanaged<CFWriteStream>?>
Run Code Online (Sandbox Code Playgroud)
然后NSStream
在CFStreamCreatePairWithSocketToHost
调用之后将它们转换回子类?
Vin*_*nzo 42
我得到了它的工作,这是我的代码:确保你在某处保留连接类的引用:-)
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")
}
}
Run Code Online (Sandbox Code Playgroud)
Sco*_*t D 28
我无法得到其他人在此主题中提供的示例.当然,他们编译了,但是一旦连接打开就会崩溃.
但是,我在WWDC 2014讨论(和iOS 8发行说明)中注意到,有一种新方法可以初始化NSStream以创建一对绑定的输入/输出流.
见下文:
var inputStream: NSInputStream?
var outputStream: NSOutputStream?
NSStream.getStreamsToHostWithName("localhost", port: 1234, inputStream: &inputStream, outputStream: &outputStream)
Run Code Online (Sandbox Code Playgroud)
这消除了对笨拙的CFStreamCreatePairWithSocketToHost调用的需要,并消除了对非托管资源的需求.
归档时间: |
|
查看次数: |
9617 次 |
最近记录: |