1.一些概念
????????進程就是相互隔離的、獨立運行的程序效诅。一個進程就是一個執(zhí)行中的程序布隔,而每個進程都有自己獨立的一塊內(nèi)存空間和一組系統(tǒng)資源。
? ? ? ? 線程是輕量級的進程澎迎,就像進程一樣庐杨,線程在程序中是獨立的、并發(fā)執(zhí)行的夹供,每個線程都有它自己的局部變量灵份。同一個進程中的多個線程之間共享相同的內(nèi)存地址空間,這就意味著它們可以訪問相同的變量和常量哮洽。
? ? ? ? 每個程序都至少有一個線程填渠,這個線程就是主線程。當一個程序啟動時鸟辅,主線程被創(chuàng)建氛什,主線程控制程序的主要流程,負責(zé)顯示和更新UI匪凉,所有的UI元素的更新必須在主線程中進行枪眉。
2.選擇NSTherad、NSOperation還是GCD
? ? ? ? (1)NSTherad是傳統(tǒng)的線程類再层,需要自己管理線程的生命周期贸铜、線程同步、加鎖聂受、睡眠及喚醒等蒿秦。
? ? ? ? (2)NSOperation是面向?qū)ο蟮母呒墑e線程類,不需要自己管理線程蛋济。
? ? ? ? (3)GCD是基于C語句級別的API棍鳖,他提供了C函數(shù)。不需要自己管理線程瘫俊,支持多核CPU處理鹊杖。GCD是蘋果重點推薦的并發(fā)技術(shù)悴灵,唯一的缺陷是它基于C語言的API。
3.GCD
? ? ? ? 在GCD中骂蓖,有一個重要的概念积瞒,那就是派發(fā)隊列(dispatch queue)。派發(fā)隊列是一個對象登下,他可以接受任務(wù)茫孔,并將任務(wù)以先到先執(zhí)行的順序來執(zhí)行。派發(fā)隊列可以是并發(fā)的或串行的被芳。并發(fā)隊列可以執(zhí)行多任務(wù)缰贝,串行隊列同一時間只能執(zhí)行單一任務(wù)。
? ? 三種類型的派發(fā)隊列
? ? ? ? 串行隊列? ? 串行隊列通常用于同步訪問一個特定的資源畔濒,每次只能執(zhí)行一個任務(wù)剩晴。使用函數(shù)dispatch_queue_create,可以創(chuàng)建串行隊列侵状。
? ? ? ? 并發(fā)隊列? ? 也稱為全局派發(fā)隊列赞弥,可以并發(fā)的執(zhí)行一個或多個任務(wù)。當并發(fā)地執(zhí)行多個任務(wù)時趣兄,必然涉及哪些任務(wù)先執(zhí)行绽左,哪些任務(wù)后執(zhí)行的問題。在macOS 10.10 和IOS 8之前艇潭,是通過并發(fā)隊列優(yōu)先級決定的拼窥,而在macOS 10.10和IOS 8之后,則通過QoS(Quality of service)技術(shù)管理蹋凝。使用dispatch_get_global_queue函數(shù)鲁纠,可以創(chuàng)建并發(fā)隊列。
? ? ? ? 主隊列? ? 它在應(yīng)用程序的主線程中仙粱,用于更新UI房交。其他兩個隊列不能更新UI。使用dispatch_get_main_queue函數(shù)伐割,可以獲得主隊列候味。
? ? QoS技術(shù)
? ? ? ? 我們通過 QoS告訴操作系統(tǒng)并發(fā)隊列如何工作,然后操作系統(tǒng)會通過合理的資源控制隔心,從而以最高效的方式執(zhí)行并發(fā)隊列白群。這其中主要涉及CPU調(diào)度、IO操作優(yōu)先級硬霍、任務(wù)執(zhí)行在哪個線程以及執(zhí)行的順序等內(nèi)容帜慢。
? ? ? ? 我們通過一個抽象的Quality of Service參數(shù)來表明任務(wù)的意圖以及類別。
? ? ? ? QsO提供NSQualityOfService(Swift版是QualityOfService)枚舉類型,它有如下5個成員粱玲。
? ? ? ? NSQualityOfServiceUserInteractive? ? 與用戶交互的任務(wù)躬柬,這些任務(wù)通常跟UI刷新有關(guān),例如動畫抽减,它會在一瞬間完成允青。
????????NSQualityOfServiceUserInitiated? ? 由用戶發(fā)起的并且可以立即得到結(jié)果的任務(wù)。例如卵沉,翻動表視圖時加載數(shù)據(jù)颠锉,然后顯示單元格,這些任務(wù)通常跟后續(xù)的用戶交互相關(guān)史汗,會在幾秒或者更短的時間完成琼掠。
????????NSQualityOfServiceUtility? ? 一些耗時的任務(wù),這些任務(wù)不會馬上返回結(jié)果停撞。例如下載任務(wù)瓷蛙,它可能花費幾秒或者幾分鐘的時間。
????????NSQualityOfServiceBackground? ? 這些任務(wù)對用戶不可見怜森,可以長時間在后臺運行速挑。
????????NSQualityOfServiceDefault? ? 優(yōu)先級介于NSQualityOfServiceUserInteractive?和NSQualityOfServiceUtility?之間谤牡。這個值是系統(tǒng)默認的副硅。