为什么我们在 Objective-C 中需要 dispatch_main_async_safe?
Why do we need dispatch_main_async_safe in Objective-C?
在一些库中,我们可以找到像dispatch_main_async_safe
这样的宏定义,比如SDWebImage。有代码:
#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_async
会发生什么。如果直接使用dispatch_async
会导致一些错误或崩溃,请举例说明。
任何想法将不胜感激,谢谢。
这个 post 应该有帮助:http://blog.benjamin-encz.de/post/main-queue-vs-main-thread/。
我认为直接使用dispatch_async
不会导致崩溃。
设想从网络获取数据后更新UI的场景,可能需要检查当前队列是否为主队列,宏dispatch_main_async_safe
的使用为调度提供了便利主队列上的任务,并确保下一个任务始终在主队列上执行。上面代码的第一步是判断当前队列是不是主队列,主队列必须是在主线程中,如果是,则立即执行block。您可能不需要将下一个任务异步分派到主队列。
否则,您必须将下一个任务异步调度到主队列。
如上post所述,主线程中可以有多个队列运行。我们应该确保 UI 相关任务始终在主队列上执行。
希望对您有所帮助。
在一些库中,我们可以找到像dispatch_main_async_safe
这样的宏定义,比如SDWebImage。有代码:
#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_async
会发生什么。如果直接使用dispatch_async
会导致一些错误或崩溃,请举例说明。
任何想法将不胜感激,谢谢。
这个 post 应该有帮助:http://blog.benjamin-encz.de/post/main-queue-vs-main-thread/。
我认为直接使用dispatch_async
不会导致崩溃。
设想从网络获取数据后更新UI的场景,可能需要检查当前队列是否为主队列,宏dispatch_main_async_safe
的使用为调度提供了便利主队列上的任务,并确保下一个任务始终在主队列上执行。上面代码的第一步是判断当前队列是不是主队列,主队列必须是在主线程中,如果是,则立即执行block。您可能不需要将下一个任务异步分派到主队列。
否则,您必须将下一个任务异步调度到主队列。
如上post所述,主线程中可以有多个队列运行。我们应该确保 UI 相关任务始终在主队列上执行。
希望对您有所帮助。