这与我之前提出的问题有关,但不同之处,我认为我会把它扔进一个新问题.我有一些代码在自定义队列上运行异步,然后在完成时在主线程上执行完成块.我想围绕这种方法编写单元测试.我的方法MyObject看起来像这样.
+ (void)doSomethingAsyncThenRunCompletionBlockOnMainQueue:(void (^)())completionBlock {
dispatch_queue_t customQueue = dispatch_queue_create("com.myObject.myCustomQueue", 0);
dispatch_async(customQueue, ^(void) {
dispatch_queue_t currentQueue = dispatch_get_current_queue();
dispatch_queue_t mainQueue = dispatch_get_main_queue();
if (currentQueue == mainQueue) {
NSLog(@"already on main thread");
completionBlock();
} else {
dispatch_async(mainQueue, ^(void) {
NSLog(@"NOT already on main thread");
completionBlock();
});
}
});
Run Code Online (Sandbox Code Playgroud)
}
我投入了主队列测试以获得额外的安全性,但它总是能够击中dispatch_async.我的单元测试如下所示.
- (void)testDoSomething {
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
void (^completionBlock)(void) = ^(void){
NSLog(@"Completion Block!");
dispatch_semaphore_signal(sema);
};
[MyObject doSomethingAsyncThenRunCompletionBlockOnMainQueue:completionBlock];
// Wait for async code to finish
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); …Run Code Online (Sandbox Code Playgroud) 我想知道如果我从viewDidLoad方法在主队列中异步调用某些内容会发生什么.一个小实验向我展示了这些结果:
这段代码:
override func viewDidLoad() {
super.viewDidLoad()
firstSelector()
DispatchQueue.main.async {
self.secondSelector()
}
for i in 1...10 {
print(i)
}
thirdSelector()
}
func firstSelector() {
print("First selector fired")
}
func secondSelector() {
print("Second selector fired")
}
func thirdSelector() {
print("Third selector fired")
}
Run Code Online (Sandbox Code Playgroud)
给出这些印刷品:
First selector fired
1
2
3
4
5
6
7
8
9
10
Third selector fired
Second selector fired
Run Code Online (Sandbox Code Playgroud)
所以最后一个被调用的方法是secondSelector.我认为这是因为主队列是串行的,当我异步调用某个方法(在本例中为secondSelector)时,它立即返回并等待直到所有其他方法都完成.在队列没有任务之后,它完成了我异步调用的方法.我的想法是对的吗?