我正在后台线程上做一些沟通工作,我这样开始:
self.thread = Thread(target: self, selector: #selector(threadMain), object: nil)
self.thread?.start()
...
func threadMain() {
...
}
正确调用threadMain,处理按原样进行滚动。 threadMain上的最后一个代码序列是通过外部提供的回调“onComplete”通知主线程,我想这样做:
print("leaving thread")
DispatchQueue.main.async {
self.onComplete?(CommunicationCallbackParams(errorCode:
self.errorCode, commState: self.commState, redirectUrl: self.redirectUrl))
}
但是,从不调用闭包内的代码。如果我删除“DispatchQueue.main.async”包装它可以工作,但我在非UI线程级别上通知。这里可能出现什么问题?
同样的原则在目标C中正常工作......
答案 0 :(得分:0)
最明显的是你使用可选链接调用self.onComplete。如果onComplete为nil,则不会调用该代码。但是,如果你没有将它包装在 text = "jsoihj a125847 asf"
Dim s as String = text Like "*a######*"
的调用中,你会说它会被调用。
答案 1 :(得分:0)
哦,找到了解决方案。我使用信号量从XCTest调用类来等待结果:
let semaphore = DispatchSemaphore.init(value:0)
let _ = Communication(url: "<some url>") { (result) in
print("Current thread is main thread: \(Thread.isMainThread)")
print(result)
semaphore.signal()
}
semaphore.wait()
该信号量模式必须阻止通知。一旦我将其改为期望,它就运行良好。
let exp = expectation(description: "\(#function)\(#line)")
let _ = Communication(url: "<some url>") { (result) in
print("Current thread is main thread: \(Thread.isMainThread)")
print(result)
exp.fulfill()
}
waitForExpectations(timeout: 60, handler: nil)