背景:代码里面有时候会把将要执行的内容放到主线程里面执行,但如果已经是主线程里面的代码调用dispatch_async的时候偶尔会出现crash,所以就需要判断是否已经在主线程里面了。通常的做法类似于下面所代码:
......
if ([NSThread isMainThread]) {
block();
} else {
dispatch_async(dispatch_get_main_queue(), block);
}
......
所以在SDWebImage库里面进行了一次封装,把这部分内容放在了一个宏里面:
#define dispatch_main_async_safe(block)\
if ([NSThread isMainThread]) {\
block();\
} else {\
dispatch_async(dispatch_get_main_queue(), block);\
}
这样就可以在代码里面调用dispatch_main_async_safe安全的分发任务到主线程里面运行
但是这个的问题是,宏里面的block是无法打断点调试的,比如:
dispatch_main_async_safe(^{
if(a) {
[self foo1];
}
else {
[self foo2];
}
});
我们无法在if判断那里加个断点,来step by step的进行调试。
所以,我才有了想要自己封装一