Ios 为什么我们需要在Objective-C中调度\u main\u async\u safe?

Ios 为什么我们需要在Objective-C中调度\u main\u async\u safe?,ios,queue,main,dispatch-async,Ios,Queue,Main,Dispatch Async,在一些库中,我们可以找到宏定义,如dispatch\u main\u async\u safe,例如。代码如下: #ifndef dispatch_main_async_safe #define dispatch_main_async_safe(block)\ if (dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL) == dispatch_queue_get_label(dispatch_get_main_queue()))

在一些库中,我们可以找到宏定义,如
dispatch\u main\u async\u safe
,例如。代码如下:

#ifndef dispatch_main_async_safe
#define dispatch_main_async_safe(block)\
    if (dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL) == dispatch_queue_get_label(dispatch_get_main_queue())) {\
        block();\
    } else {\
        dispatch_async(dispatch_get_main_queue(), block);\
    }
#endif
我很困惑为什么这个宏定义是必要的,如果我们直接使用函数
dispatch\u async
,会发生什么。如果直接使用
dispatch\u async
会导致一些错误或崩溃,请给出一个例子

任何想法都将不胜感激,谢谢。

这篇文章应该有帮助:

我认为直接使用
dispatch\u async
不会导致崩溃

设想在从网络获取数据后更新UI的场景中,您可能需要检查当前队列是否为主队列,使用宏
dispatch\u main\u async\u safe
可以方便地在主队列上调度任务,并确保下一个任务始终在主队列上执行。上述代码的第一步是确定当前队列是否为主队列,主队列必须表示它位于主线程中,如果结果为是,则立即执行该块。您可能不需要异步地将下一个任务分派到主队列

否则,必须将下一个任务异步分派到主队列

正如上面提到的,主线程中可以运行多个队列。我们应该确保始终在主队列上执行与UI相关的任务

我希望这能帮助你