,因爲我們知道main_queue是串行queue.There沒有真正的異步。主隊列中沒有異步?
- (void)someMethod{
dispatch_async(dispatch_get_main_queue(),^{
NSLog(@"main_async invoke");
});
NSLog(@"method invoke");
}
上面的代碼「方法調用」「main_async援引」前會寫。因爲在main_queue沒有真正的異步。但代碼箱可以SAI NO:
- (void)someMethod{
__block BOOL flag=YES;
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"blockOperation invoke");
[NSThread sleepForTimeInterval:4];
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"main_async invoke");
flag=NO;
});
}];
[blockOperation start];
while (flag) {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.5]];
}
NSLog(@"method invoke");
}
上面的代碼「方法來調用」會後「main_async援引」被寫 我認爲這是因爲「RunLoop'.Is的有誰能解釋這是爲什麼?
你是什麼意思「真正的異步」?在你的第一個例子中,這個塊是異步執行的。正如你指出的那樣,主隊列是一個串行隊列,並且由於任務沒有被搶佔,該塊將在當前方法返回後的一段時間纔會執行,但它仍然是異步的。也許你的意思是並行執行,並且這不會發生在任何串行隊列上。 – Paulw11
我可以理解第一個例子。我的問題是爲什麼在第二個例子中,'NSLog(@「main_async invoke」)'在'NSLog(@「method invoke」)之前執行。當前方法返回後的一段時間。在第二個示例中,塊在當前方法返回之前執行。 – DoradoIs90
因爲在第二個塊中,您正在直接啓動操作。您未將其提交給操作隊列以供稍後執行。 – Paulw11