Objective c 在异步调度到当前线程之前,是否需要检查当前线程是否为主线程?
在异步调度到当前线程之前,是否确实需要检查当前线程是否为主线程?在性能或其他方面有什么优势吗 我知道从同一队列同步调度会导致死锁。但是我真的需要像下面代码片段中的某个人那样检查当前线程吗Objective c 在异步调度到当前线程之前,是否需要检查当前线程是否为主线程?,objective-c,swift,multithreading,grand-central-dispatch,Objective C,Swift,Multithreading,Grand Central Dispatch,在异步调度到当前线程之前,是否确实需要检查当前线程是否为主线程?在性能或其他方面有什么优势吗 我知道从同一队列同步调度会导致死锁。但是我真的需要像下面代码片段中的某个人那样检查当前线程吗 + (void)dispatchOnMainThread:(void (^)(void))task { if ([NSThread isMainThread]) // Is this necessary? { task(); }
+ (void)dispatchOnMainThread:(void (^)(void))task
{
if ([NSThread isMainThread]) // Is this necessary?
{
task();
}
else
{
dispatch_async(dispatch_get_main_queue(), task);
}
}
但是我真的需要像下面代码片段中的某个人那样检查当前线程吗
不是真的。如果您已经在主线程上,那么当代码结束时,dispatch\u async
块将被调度。因此可能会有一点延迟,因为我们需要结束当前的运行循环/事务,但这并不明显
我一直使用
dispatch\u async
到主线程,以确保在不确定的情况下(例如KVO回调),我处于主线程上。没有伤害,没有犯规。这只是一种保险形式。您不需要检查自己是否在主线程上,dispatch\u async只是将任务放入队列并返回。非常安全
另一方面,如果您检查自己是否在主线程上并直接执行任务,则不要调用方法dispatchOnMainThread,因为它不进行调度。应用程序行为可能因此而改变。我将其称为runOnMainThread,并将其设为普通的C函数。而且它更适合调试 如果它是UI任务,那么是的,这取决于。我也遇到过该代码。就我个人而言,如果我不能100%确定我在主线程中,我更喜欢在主队列中调度。谢谢Matt。这就是我一直在寻找的答案。