本文不做基本概念講解,只做了一些總結,方便自己日后查看
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,會立即退出,之后再執行肯定就沒有用了