直接执行方法和在 dispatch_async(dispatch_get_main_queue(), ^{}) 块中执行方法有什么区别
What is the difference between perform a method directly and in the block of dispatch_async(dispatch_get_main_queue(), ^{})
我发现在某些情况下,我直接执行 [self doSomething] 的结果与我在 GCD 主体的块中执行的结果不同:
dispatch_async(dispatch_get_main_queue(), ^{
[self doSomething]
})
我已经执行 [NSThread currentThread] 来确认它已经在主线程上了。那么有什么区别呢?
只有[self doSomething]
会被同步调用,使用dispatch_async
会被异步调用
Statement A
[self doSomething]
Statement B
以上代码将开始执行语句A,完成Statement A
,开始执行函数doSomething
,完成函数doSomething
,然后开始执行并完成Statement B
。
Statement A
dispatch_async(dispatch_get_main_queue(), ^{
[self doSomething]
})
Statement B
上面的块将开始并完成 Statement A
的执行,然后它在队列中添加 doSomething
函数调用(它可能会或可能不会立即开始)然后它会开始执行 Statement B
无需等待完成函数 doSomething
.
的执行
因此,如果 Statement B
(以及您的函数调用之后的其他语句)独立于函数 doSomething
的结果,那么您可以进行异步调用。
我发现在某些情况下,我直接执行 [self doSomething] 的结果与我在 GCD 主体的块中执行的结果不同:
dispatch_async(dispatch_get_main_queue(), ^{
[self doSomething]
})
我已经执行 [NSThread currentThread] 来确认它已经在主线程上了。那么有什么区别呢?
只有[self doSomething]
会被同步调用,使用dispatch_async
会被异步调用
Statement A
[self doSomething]
Statement B
以上代码将开始执行语句A,完成Statement A
,开始执行函数doSomething
,完成函数doSomething
,然后开始执行并完成Statement B
。
Statement A
dispatch_async(dispatch_get_main_queue(), ^{
[self doSomething]
})
Statement B
上面的块将开始并完成 Statement A
的执行,然后它在队列中添加 doSomething
函数调用(它可能会或可能不会立即开始)然后它会开始执行 Statement B
无需等待完成函数 doSomething
.
因此,如果 Statement B
(以及您的函数调用之后的其他语句)独立于函数 doSomething
的结果,那么您可以进行异步调用。