之前没注意这块,今天好奇点进来看看,个人理解了一下.
//这里的判断是否在主线程,之前用的NSThread的isMainThread.但是并不是所有在主线程执行的任务,都是主队列的任务,会导致某些需要主队列运行的库产生问题.VectorKit.
//dispatch_queue_get_label 返回创建队列时为队列指定的标签。主队列标签为: com.apple.main-thread
//如果在主线程内调用dispatch_async(dispatch_get_main_queue(), block),可能会导致block在下一次runloop执行,从而导致更新UI时出错,而且还浪费资源.
//所以如果在主线成,直接执行了.不在才回归.
#ifndef dispatch_main_async_safe //#if not define
#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
网友评论