无法在 Swift 中从 XCTest 打开 NSStream



我试图写一个XCTest测试套接字连接。下面是我的连接代码的大致样子:

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的工作方式。队列动态地创建和销毁线程。所以我在运行循环中为一个寿命很短的线程调度我的流。因此,我的回调函数永远不会被调用,因为run循环被销毁了。

正确的解决方案是直接创建一个NSThread,并从该线程中使用run循环,而不是尝试使用队列。

最新更新