文章目錄:
一、圖示理解
二、各個角色
三、存在的挑戰(zhàn)
一、圖示理解
二、各個角色
1.程序員(創(chuàng)建任務)
代碼就是任務
當一些任務需要在一條新線程而非當前線程執(zhí)行時若程序員直接創(chuàng)建線程可能會引發(fā)的一個問題是,如果你的任務和所基于的框架任務都創(chuàng)建自己的線程時,那么活動的線程數(shù)量有可能以指數(shù)級增長。這會消耗大量資源,是不允許的
解決方案:使用GCD&operation queue
通過 GCD,開發(fā)者不用再直接跟線程打交道了,只需要向隊列中添加代碼塊即可,GCD 在后端管理著一個線程池。GCD 不僅決定著你的代碼塊將在哪個線程被執(zhí)行,它還根據(jù)可用的系統(tǒng)資源對這些線程進行管理。
2.GCD&operation queue(管理任務,安排任務)
以GCD為例:
程序員所需要做的就是按照GCD的規(guī)則(串行并行,同步異步)創(chuàng)建添加任務
可以將串行并行,同步異步理解為任務的屬性
通過指定任務的串行并行,GCD判斷如何分配任務即分配任務給哪個線程
通過指定任務的同步異步,GCD告訴將要執(zhí)行該任務的線程如何處理新任務與其當前任務的關(guān)系
3.線程(執(zhí)行任務)
執(zhí)行任務的人(干活的)
4.RunLoop(為線程監(jiān)測事件,事件發(fā)生時告訴線程執(zhí)行事件觸發(fā)的任務)
Runloop負責監(jiān)測處理 UI 事件、計時器,以及其它內(nèi)核相關(guān)事件。
無論開發(fā)者什么時候設(shè)置計時器、使用NSURLConnection或者調(diào)用performSelector:withObject:afterDelay:,其實背后都是 run loop 在處理這些異步事件。
5.資源(線程執(zhí)行任務所需,如內(nèi)存等)
6.Autoreleasepool(為線程清理執(zhí)行任務后產(chǎn)生的垃圾)
Autoreleasepool工作原理:?
RunLoop在線程執(zhí)行完一次任務后銷毀當前Autoreleasepool同時為線程創(chuàng)建一個新的Autoreleasepool以便線程下一次執(zhí)行任務使用
Autoreleasepool被銷毀會引起Autoreleasepool中所有的對象release從而釋放內(nèi)存
三、存在的挑戰(zhàn)
資源共享,互斥鎖,死鎖,資源饑餓,優(yōu)先級反轉(zhuǎn)
四
操作隊列提供了在 GCD 中不那么容易復制的有用特性。其中最重要的一個就是可以取消在任務處理隊列中的任務,在稍后的例子中我們會看到這個。而且操作隊列在管理操作間的依賴關(guān)系方面也容易一些。另一面,GCD 給予你更多的控制權(quán)力以及操作隊列中所不能使用的底層函數(shù)。