我正在尝试编写一个测试套接字连接的XCEST。我的连接代码大致如下:
public class MyConnection: NSObject, NSStreamDelegate {
private let queue = NSOperationQueue()
private var inputStream: NSInputStream!
private var outputStream: NSOutputStream!
public func connect() {
println("Attempting to connect")
queue.addOperationWithBlock() {
var readStream: Unmanaged<CFReadStream>?
var writeStream: Unmanaged<CFWriteStream>?
CFStreamCreatePairWithSocketToHost(nil,
"[my ip address]",
8333,
&readStream,
&writeStream);
if readStream == nil || writeStream == nil {
println("Connection failed")
return
}
self.inputStream = readStream!.takeUnretainedValue()
self.outputStream = writeStream!.takeUnretainedValue()
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()
}
}
// MARK: - NSStreamDelegate
public func stream(stream: NSStream!, handleEvent event: NSStreamEvent) {
println("THIS NEVER GETS CALLED!")
// Notifies delegate that connection opened.
}
}
我编写的XcTestCase基本上只是调用connect()方法,并等待在连接成功后调用委托方法。但是,从未调用委托方法。我需要做些特别的事情才能在考试中发挥作用吗?
最佳答案
这在我的单元测试中是失败的,这是一个危险的事实。由于nsOperationQueue的工作方式,此代码不起作用。队列会动态创建和销毁线程。所以我在运行循环中为一个寿命很短的线程调度流。因此,我的回调从未被调用,因为运行循环已被破坏。
正确的解决方案是直接创建一个nsthread,并使用该线程的run循环,而不是尝试使用队列。
关于swift - 无法在Swift中从XCTest打开NSStream,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25397357/