我正在将一个应用程序从Objective移植到Swift,我需要使用以下方法:
CFStreamCreatePairWithSocketToHost(alloc: CFAllocator!, host: CFString!, port: UInt32, \
readStream: CMutablePointer<Unmanaged<CFReadStream>?>, \
writeStream: CMutablePointer<Unmanaged<CFWriteStream>?>)旧的逻辑看起来是这样的(几个网站似乎都同意这个逻辑):
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空间”中,而且这种类型的系统已经发生了变化。
如何将我的流转换为
CMutablePointer<Unmanaged<CFReadStream>?>, and
CMutablePointer<Unmanaged<CFWriteStream>?>然后在调用NSStream之后将它们转换回CFStreamCreatePairWithSocketToHost子类?
发布于 2014-06-04 17:46:56
我已经开始工作了,下面是我的代码:确保在某个地方保存一个连接类的引用:-)
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")
}
}发布于 2014-07-02 19:21:04
我无法让其他人在这个线程中提供的例子起作用。当然,他们编译了,但是一旦连接打开,他们就崩溃了。
但是,我在2014年的讨论(和iOS 8发布说明)中注意到,有一种新的方法来初始化NSStream,用于创建绑定的输入/输出流对。
见下文:
var inputStream: NSInputStream?
var outputStream: NSOutputStream?
NSStream.getStreamsToHostWithName("localhost", port: 1234, inputStream: &inputStream, outputStream: &outputStream)这消除了对尴尬的CFStreamCreatePairWithSocketToHost调用的需求,也消除了对非托管资源的需求。
发布于 2014-06-05 03:14:50
我想出了怎么做。几个重要的注意事项:
CMutablePointers将自动创建。T和getRetainedValue()的Unmanaged<T>中获得.getUnretainedValue() (似乎.getUnretainedValue()类似于__bridge_transfer)nil。nil,它将转换为false条件。到目前为止,我(未经测试):
var readStream: Unmanaged<CFReadStream>?
var writeStream: Unmanaged<CFWriteStream>?
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, host, port, \
&readStream, &writeStream)
if (readStream && writeStream) {
inputStream = readStream!.takeUnretainedValue();
outputStream = writeStream!.takeUnretainedValue();
}https://stackoverflow.com/questions/24028995
复制相似问题