无法在Swift中从XCTest打开NSStream

无法在Swift中从XCTest打开NSStream

我正在尝试编写一个测试套接字连接的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/

10-08 23:30