本文不做基本概念讲解,只做了一些总结,方便自己日后查看
1.dispatch_get_main_queue
同步提交到主线程,会造成线程阻塞,任务相互等待
异步提交到主队列,在主线程上执行,实质是降低任务优先级,因此会在viewWillAppear,viewDidAppear之后执行,跟runloop有关
2.串行队列
串行队列异步会开启一个新线程,但是只会开一个,如果嵌套如果同步,会造成线程阻塞,嵌套异步不会,嵌套异步任务相当于降低,让串行队列上的任务任务执行完后再执行
(同步嵌套同步会阻塞线程,嵌套异步,会新开一个线程)
(异步嵌套同步会阻塞线程,嵌套异步,不会开启新的线程,会将嵌套任务放入队尾执行)
3.并行队列异步会开启一个新线程,而且还会开多个,如果同步,会按照顺序执行
(异步嵌套异步,会开启新的线程,线程数目由系统决定,嵌套同步,会按顺序执行)
(异步嵌套异步,会开启新的线程,同步嵌套同步,依次按顺序执行)
4.performSelector
先看图,
请问performTest方法会执行吗?
答案是不会
performSelector 在指定线程中立即执行,相当于一个普通的消息发送
performSelector:withObject:afterDelay 其实是在内部创建了一个timer,然后添加到当前线程的runloop中
主线程上能执行,主线程runloop是默认开启的,因此能调度,但是子线程runloop是默认关闭的,因此不能调度事件
解决办法:
这里需要手动将子线程runloop开启,注意需要在 performSelector:withObject:afterDelay 之后开启,如果在之前开启的话,因为runloop没有source,会立即退出,之后再执行肯定就没有用了