主线程和主队列的关系
先说结论
主队列只在主线程中被执行的,而主线程运行的是一个 runloop,不仅仅只有主队列的中的任务,还会处理 UI 的布局和绘制任务。
几个例子
一、自定义串行队列,同步执行。
- (void)someMethod { |
二、主线程判断的几个方法
//下面这几种切换到主线程执行的方法, 你更喜欢哪种?有什么优缺点? |
综合来说,方法 4 是更好的判断是否是主线程的方式。
苹果的一个bug
在苹果的MapKit框架中,有一个叫做addOverlay的方法,它在底层实现的时候,不仅仅要求代码执行在主线程上,
还要求执行在 GCD 的主队列上。这是一个极罕见的问题,但已经有人在使用 ReactiveCocoa 时踩到了坑,并提交了 issue。
苹果的 Developer Technology Support 承认这是一个 bug。
https://toutiao.io/posts/535857/app_preview
正如上面的方法二,使用起来不会有什么问题,但是在这里,如果把一些数据通过dispatch_set_specific
绑定到main queue
中,这才会产生 bug。例如下面,
这个获取就是和 main queue
绑定的,如果仅仅在主线程访问,无法获取到数据。
var skr = DispatchSpecificKey("") |
参考
- 多线程-奇怪的GCD
- 主线程中也不绝对安全的 UI 操作
- iTeamTime|技术清谈