(XCTestCase)如何在主线程或外部(任何其他线程)中调用块?

时间:2015-07-09 19:10:59

标签: swift xctest

如果在主线程或外部(任何其他线程)中调用了块,如何断言?假设我们有一个班级:

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)
}

2 个答案:

答案 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