如果在主线程或外部(任何其他线程)中调用了块,如何断言?假设我们有一个班级:
class A {
func asyncOperation(handler: Void -> Void) {
//some processing
dispatch_async(dispatch_get_main_queue(), completionHandler)
}
}
class ATests: XCTestCase {
func testHandlerInMainThread(){
let a = A()
let expectation = expectationWithDescription("Handler must be called in main thread")
a.asyncOperation{
// how to get current_queue ?
XCTAssertEqual( current_queue, dispatch_get_main_queue())
expectation.fulfill()
}
waitForExpectationsWithTimeout(3, handler: nil)
}
答案 0 :(得分:2)
如果当前线程是主线程,您可以使用NSThread
的类方法isMainThread
返回true
。
如果要测试特定队列是否实际上是代码执行的队列,您可以测试队列的“标签”:
dispatch_queue_t
dispatch_queue_create(const char *label, dispatch_queue_attr_t attr);
const char *
dispatch_queue_get_label(dispatch_queue_t queue);
后者在单元测试中更有用,而不是真正的代码。您不应该使用这种方法来确定您的代码是否可能死锁,因为这是不够的!
修改强>
为了获得当前队列的标签(在Swift中):
let label : String? = String.fromCString(dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL))
答案 1 :(得分:0)
使用dispatchPrecondition(condition:)
。
dispatchPrecondition(condition: .onQueue(self.myQueue))
来源:https://developer.apple.com/documentation/dispatch/1780605-dispatchprecondition