是否需要在异步调度之前检查当前线程是否是主线程?

时间:2016-09-27 13:37:26

标签: objective-c swift multithreading grand-central-dispatch

是否真的有必要在异步调度之前检查当前线程是否是主线程?在性能或其他方面有任何优势吗?

我知道从同一队列同步调度会导致死锁。但是我真的需要检查当前的线程,就像有人在下面的代码片段中做的那样吗?

+ (void)dispatchOnMainThread:(void (^)(void))task
    {
        if ([NSThread isMainThread]) // Is this necessary?
        {
            task();
        }
        else
        {
            dispatch_async(dispatch_get_main_queue(), task);
        }
    }

2 个答案:

答案 0 :(得分:4)

  

但我真的需要检查当前的线程,就像有人在下面的代码片段中所做的那样

不是真的。如果您已经在主线程上,那么当您的代码结束时,您的dispatch_async块将被分派。所以可能会有一点延迟,因为我们需要当前的运行循环/事务结束,但它不会引人注意。

我一直在主线程中使用dispatch_async作为确保我在主线程上的方式,我不确定(例如KVO回调)。没有伤害,没有犯规。这只是一种保险形式。

答案 1 :(得分:0)

您不需要检查您是否在主线程上,dispatch_async只是将任务放入队列并返回。万无一失。

另一方面,如果你检查自己是否在主线程上并直接执行任务,那么就不要调用你的方法dispatchOnMainThread,因为它没有调度。因此,应用程序行为可能会发生变化我称之为runOnMainThread,我将它变为普通的C函数。它的调试效果更好。