Не удается открыть NSStream из XCTest в Swift

Я пытаюсь написать 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() и ожидает вызова метода делегата после успешного подключения. Однако метод делегата никогда не вызывается. Нужно ли мне делать что-то особенное, чтобы это работало в моем тесте?


person kgreenek    schedule 20.08.2014    source источник


Ответы (1)


Тот факт, что это не срабатывало в моих модульных тестах, был отвлекающим маневром. Этот код не работает из-за того, как работает NSOperationQueue. Очередь создает и уничтожает потоки на лету. Поэтому я планировал свои потоки в цикле выполнения для потока, который был недолговечным. Следовательно, мои обратные вызовы никогда не вызывались, потому что цикл выполнения был разрушен.

Правильным решением было создать NSThread напрямую и использовать цикл выполнения из этого потока вместо того, чтобы пытаться использовать очередь.

person kgreenek    schedule 19.09.2014
comment
так как решить эту проблему, не могли бы вы сделать пример кода, пожалуйста? - person Bao Hoa; 02.12.2016