1.一些概念
????????進程就是相互隔離的、獨立運行的程序。一個進程就是一個執(zhí)行中的程序,而每個進程都有自己獨立的一塊內存空間和一組系統(tǒng)資源。
? ? ? ? 線程是輕量級的進程,就像進程一樣,線程在程序中是獨立的、并發(fā)執(zhí)行的,每個線程都有它自己的局部變量。同一個進程中的多個線程之間共享相同的內存地址空間,這就意味著它們可以訪問相同的變量和常量。
? ? ? ? 每個程序都至少有一個線程,這個線程就是主線程。當一個程序啟動時,主線程被創(chuàng)建,主線程控制程序的主要流程,負責顯示和更新UI,所有的UI元素的更新必須在主線程中進行。
2.選擇NSTherad、NSOperation還是GCD
? ? ? ? (1)NSTherad是傳統(tǒng)的線程類,需要自己管理線程的生命周期、線程同步、加鎖、睡眠及喚醒等。
? ? ? ? (2)NSOperation是面向對象的高級別線程類,不需要自己管理線程。
? ? ? ? (3)GCD是基于C語句級別的API,他提供了C函數(shù)。不需要自己管理線程,支持多核CPU處理。GCD是蘋果重點推薦的并發(fā)技術,唯一的缺陷是它基于C語言的API。
3.GCD
? ? ? ? 在GCD中,有一個重要的概念,那就是派發(fā)隊列(dispatch queue)。派發(fā)隊列是一個對象,他可以接受任務,并將任務以先到先執(zhí)行的順序來執(zhí)行。派發(fā)隊列可以是并發(fā)的或串行的。并發(fā)隊列可以執(zhí)行多任務,串行隊列同一時間只能執(zhí)行單一任務。
? ? 三種類型的派發(fā)隊列
? ? ? ? 串行隊列? ? 串行隊列通常用于同步訪問一個特定的資源,每次只能執(zhí)行一個任務。使用函數(shù)dispatch_queue_create,可以創(chuàng)建串行隊列。
? ? ? ? 并發(fā)隊列? ? 也稱為全局派發(fā)隊列,可以并發(fā)的執(zhí)行一個或多個任務。當并發(fā)地執(zhí)行多個任務時,必然涉及哪些任務先執(zhí)行,哪些任務后執(zhí)行的問題。在macOS 10.10 和IOS 8之前,是通過并發(fā)隊列優(yōu)先級決定的,而在macOS 10.10和IOS 8之后,則通過QoS(Quality of service)技術管理。使用dispatch_get_global_queue函數(shù),可以創(chuàng)建并發(fā)隊列。
? ? ? ? 主隊列? ? 它在應用程序的主線程中,用于更新UI。其他兩個隊列不能更新UI。使用dispatch_get_main_queue函數(shù),可以獲得主隊列。
? ? QoS技術
? ? ? ? 我們通過 QoS告訴操作系統(tǒng)并發(fā)隊列如何工作,然后操作系統(tǒng)會通過合理的資源控制,從而以最高效的方式執(zhí)行并發(fā)隊列。這其中主要涉及CPU調度、IO操作優(yōu)先級、任務執(zhí)行在哪個線程以及執(zhí)行的順序等內容。
? ? ? ? 我們通過一個抽象的Quality of Service參數(shù)來表明任務的意圖以及類別。
? ? ? ? QsO提供NSQualityOfService(Swift版是QualityOfService)枚舉類型,它有如下5個成員。
? ? ? ? NSQualityOfServiceUserInteractive? ? 與用戶交互的任務,這些任務通常跟UI刷新有關,例如動畫,它會在一瞬間完成。
????????NSQualityOfServiceUserInitiated? ? 由用戶發(fā)起的并且可以立即得到結果的任務。例如,翻動表視圖時加載數(shù)據(jù),然后顯示單元格,這些任務通常跟后續(xù)的用戶交互相關,會在幾秒或者更短的時間完成。
????????NSQualityOfServiceUtility? ? 一些耗時的任務,這些任務不會馬上返回結果。例如下載任務,它可能花費幾秒或者幾分鐘的時間。
????????NSQualityOfServiceBackground? ? 這些任務對用戶不可見,可以長時間在后臺運行。
????????NSQualityOfServiceDefault? ? 優(yōu)先級介于NSQualityOfServiceUserInteractive?和NSQualityOfServiceUtility?之間。這個值是系統(tǒng)默認的。