Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在异步调度到当前线程之前,是否需要检查当前线程是否为主线程?_Objective C_Swift_Multithreading_Grand Central Dispatch - Fatal编程技术网

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。这就是我一直在寻找的答案。