是否真的有必要在异步调度之前检查当前线程是否是主线程?在性能或其他方面有任何优势吗?
我知道从同一队列同步调度会导致死锁。但是我真的需要检查当前的线程,就像有人在下面的代码片段中做的那样吗?
+ (void)dispatchOnMainThread:(void (^)(void))task
{
if ([NSThread isMainThread]) // Is this necessary?
{
task();
}
else
{
dispatch_async(dispatch_get_main_queue(), task);
}
}
答案 0 :(得分:4)
但我真的需要检查当前的线程,就像有人在下面的代码片段中所做的那样
不是真的。如果您已经在主线程上,那么当您的代码结束时,您的dispatch_async
块将被分派。所以可能会有一点延迟,因为我们需要当前的运行循环/事务结束,但它不会引人注意。
我一直在主线程中使用dispatch_async
作为确保我在主线程上的方式,我不确定(例如KVO回调)。没有伤害,没有犯规。这只是一种保险形式。
答案 1 :(得分:0)
您不需要检查您是否在主线程上,dispatch_async只是将任务放入队列并返回。万无一失。
另一方面,如果你检查自己是否在主线程上并直接执行任务,那么就不要调用你的方法dispatchOnMainThread,因为它没有调度。因此,应用程序行为可能会发生变化我称之为runOnMainThread,我将它变为普通的C函数。它的调试效果更好。