无法在 Swift 中从 XCTest 打开 NSStream
Posted
技术标签:
【中文标题】无法在 Swift 中从 XCTest 打开 NSStream【英文标题】:Can't open NSStream from XCTest in Swift 【发布时间】:2014-08-20 05:35:10 【问题描述】:我正在尝试编写一个测试套接字连接的 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() 方法,并等待连接成功后调用委托方法。但是,从不调用委托方法。我是否需要为此做一些特别的事情才能在我的测试中发挥作用?
【问题讨论】:
【参考方案1】:这在我的单元测试中失败的事实是一个红鲱鱼。由于 NSOperationQueue 的工作方式,此代码不起作用。队列动态创建和销毁线程。所以我在运行循环中为一个生命周期很短的线程安排了我的流。因此,我的回调从未被调用,因为运行循环被破坏了。
正确的解决方案是直接创建一个 NSThread 并使用该线程的运行循环,而不是尝试使用队列。
【讨论】:
请问如何解决这个问题,你能做一个示例代码吗?以上是关于无法在 Swift 中从 XCTest 打开 NSStream的主要内容,如果未能解决你的问题,请参考以下文章
在 XCTest 的 UI 测试中从 TextView 获取文本
在 swift 4.0 中从 firebase 快照字典中获取值时打开一个可选的 nil
如何在 xctest 中使用 swift 点击地图注释时访问标注视图
在 XCTest 测试中从情节提要加载的视图控制器中清空 UIView 快照(间歇性)