并發

在本書的這一部分中,您將學習并發的基礎知識。你會學到它是什么,它能解決什么問題,你為什么要用它?

此外,您將了解并發在iOS開發中所包含的基本部分:Grand Central DispatchOperations

本節將為您提供有關并發性的基本知識,所以請務必通讀!接下來的部分將分別更深入地討論這些概念。

第1章:引言:快速了解并發性是什么,以及為什么你可能想要使用它。
第2章:GCD vs Operations:GCD vs Operations:并發可以通過Grand Central Dispatch (GCD)或操作來處理。了解兩者之間的區別以及為什么你會選擇其中一種。

第一章節:介紹

性能、響應性。它們不是性感的任務。如果處理得當,沒有人會感謝你。如果操作不當,應用程序的留存率將會下降,你會在下一次的年度績效評估中被淘汰。
在速度、性能和總體響應能力方面,應用程序可以通過多種方式進行優化。這本書將關注并發的主題。

1.1 并發性是什么?

維基百科將并發性定義為“將程序、算法或問題分解為順序無關或部分順序的組件或單元的可分解性屬性”。這意味著查看應用程序的邏輯,以確定哪些部分可以同時運行,并且可能以隨機的順序運行,但仍然可以得到正確的數據流實現。
現代設備幾乎總是有一個以上的CPU,蘋果的iphone自2011年以來一直是雙核的。擁有多個核心意味著它們能夠同時運行多個任務。通過將應用程序分割成邏輯“塊”代碼,iOS設備可以同時運行程序的多個部分,從而提高整體性能。

1.2 為什么使用并發?

確保您的應用程序盡可能平穩地運行是非常重要的,并且終端用戶永遠不會被迫等待某些事情發生。對于大多數與計算機無關的事情來說,一秒鐘是非常短的時間。然而,如果一個人在像iPhone這樣的設備上做了一個動作后,需要等待一秒鐘才能看到響應,那感覺就像漫長的等待一樣。“它太慢了”是導致你的應用被卸載的主要原因之一。

在圖像表中滾動是終端用戶會因缺乏并發性而受到影響的一種比較常見的情況。如果您需要從網絡下載一個圖像,或者在顯示它之前執行某種類型的圖像處理,滾動將會中斷,您將被迫顯示多個“繁忙”指示器而不是預期的圖像。

使用并發的一個好處是,它可以幫助您花更多的時間考慮應用程序的總體架構。你會發現自己不再只是編寫大量的方法來“完成工作”,而是自然地編寫更小的、更易于管理的、可以并發運行的方法。

1.3 如何使用并發性

這就是這本書的重點!在高層次上,您需要構建您的應用程序,以便一些任務可以同時運行。修改同一資源的多個任務(例如。不能同時運行,除非您使它們線程安全。

訪問不同資源或只讀共享資源的任務都可以通過不同的線程訪問,從而實現更快的處理。

本書將關注iOS為您提供并發運行代碼能力的兩種主要方式。關于Grand Central分派的第一部分將介紹一些常見場景,您將發現自己能夠實現并發性。您將學習如何在后臺運行任務,如何將任務分組,以及如何處理可以同時運行的任務數量的限制。在第一部分結束時,您還將對并發性的危險以及如何避免它們有一個深刻的理解。

在第二部分中,您將關注Operation類。構建在中央調度之上的操作允許處理更復雜的場景,比如在后臺線程上運行可重用代碼,讓一個線程依賴于另一個線程,甚至在操作啟動或完成之前取消操作。
大多數現代編程語言都提供了某種形式的并發性,Swift當然也不例外。不同的語言使用不同的機制來處理并發性。例如,c#和Typescript使用異步/等待模式,而Swift使用閉包來處理在另一個線程上運行的內容。Swift 5最初計劃實現更常見的異步/等待模式,但它被從規范中刪除,直到下一個版本。

1.4 從這里到哪里去?

好的,當然到下一頁!希望當你讀完下面幾章的時候,你會對并發可以為你的應用程序做什么以及為什么你的終端用戶會欣賞你為使應用程序盡可能快地執行所付出的額外努力有一個認識。在應用程序生命周期的早期,知道什么時候使用Grand Central Dispatch而不是Operation子類,將節省您在開發過程中重復工作的時間。

第二章節: GCD & Operations

在并發應用程序時,您將使用兩個api: Grand Central Dispatch(通常稱為GCD)和Operations。這些既不是相互競爭的技術,也不是你只能在兩者之間選擇的東西。事實上,Operations是建立在GCD之上的!

2.1 Grand Central Dispatch

GCD是蘋果對C語言libdispatch庫的實現。它的目的是將任務(方法或閉包)排隊,根據資源的可用性,這些任務可以并行運行;然后它在一個可用的處理器內核上執行這些任務。

注意:蘋果的文檔有時會用block代替closure,因為這是Objective-C中使用的名稱。您可以認為它們在并發的上下文中是可互換的。

雖然GCD在其實現中使用線程,但作為開發人員,您不需要擔心自己管理線程。GCD的任務非常輕,以至于蘋果在2009年的GCD技術簡報中說,實現GCD只需要15條指令,而創建傳統的線程可能需要幾百條指令。

GCD為您管理的所有任務都放在GCD管理的先進先出(FIFO)隊列中。提交給隊列的每個任務都將在系統完全管理的線程池中執行。

注意:不能保證任務將針對哪個線程執行

2.1.1 同步異步任務

放置在隊列中的工作可以同步運行,也可以異步運行。當同步運行一個任務時,您的應用程序將等待并阻塞當前的運行循環,直到執行結束,然后再轉移到下一個任務。或者,異步運行的任務將啟動,但立即返回應用程序的執行。通過這種方式,應用程序可以在執行第一個任務時自由地運行其他任務

注意:重要的是要記住,雖然隊列是基于FIFO的,但這不能確保任務按照提交的順序完成。FIFO過程適用于任務開始時,而不是任務結束時。

通常,你會想要接受任何你能找到的長時間運行的非ui任務,并讓它在后臺異步運行。GCD通過閉包和幾行代碼使這變得非常簡單,如下所示:

// Class level variable
let queue = DispatchQueue(label: "com.raywenderlich.worker")

// Somewhere in your function
queue.async {
  // Call slow non-UI methods here
  
  DispatchQueue.main.async {
    // Update the UI here
  }
}

您將在第3章“隊列和線程”中學習所有關于DispatchQueue的內容。通常,您創建一個隊列,向它提交一個任務以在后臺線程上異步運行,完成后,將代碼委托回主線程以更新UI。

2.1.2 串行和并發隊列

任務提交到的隊列也具有串行或并發的特征。串行隊列只有一個與之關聯的線程,因此在任何給定時間只允許執行一個任務。另一方面,并發隊列能夠利用系統擁有的所有線程。線程將根據需要在并發隊列上創建和釋放。

注意:雖然你可以告訴iOS你想使用一個并發隊列,但記住,不能保證一次運行多個任務。如果你的iOS設備完全陷入困境,你的應用程序正在爭奪資源,它可能只能運行一個任務。

雖然最初的區別看起來很微妙,但僅僅因為任務是異步的并不意味著它們將并發運行。實際上,您可以向串行隊列或并發隊列提交異步任務。同步或異步只是標識運行任務的隊列是否必須等待任務完成后才能產生下一個任務。

另一方面,將某個對象分類為串行還是并發,可以識別該隊列是有一個線程可用還是有多個線程可用。如果你仔細想想,向一個串行隊列提交三個異步任務意味著每個任務必須在下一個任務能夠開始之前完全完成,因為只有一個線程可用。
換句話說,一個任務是同步的還是不同步的都與任務的源對話。串行或并發與任務的目標通信

2.2 Operations

GCD對于需要在后臺運行一次的常見任務來說非常棒。當您發現自己正在構建應該可重用的功能時——比如圖像編輯操作——您可能希望將該功能封裝到一個類中。通過子類化Operation,您可以實現這個目標!

2.2.1 Operation subclassing

Operation是完全功能的類,可以提交給操作隊列,就像你提交一個工作閉包給GCD的DispatchQueue一樣。因為它們是類并且可以包含變量,所以您可以知道操作在任何給定點的狀態。
操作可以以下列任何狀態存在:

  • isReady
  • isExecuting
  • isCancelled
  • isFinished

與GCD不同,操作在默認情況下是同步運行的,讓它異步運行需要做更多的工作。雖然您可以自己直接執行操作,但由于其同步特性,這幾乎不是一個好主意。您將希望通過將它提交到一個OperationQueue來將它從主線程中刪除,這樣UI性能就不會受到影響。

2.2.2 額外的功能

但是等等,還有更多!操作提供了對任務的更大控制,因為您現在可以處理諸如取消任務、報告任務狀態、將異步任務包裝到操作中以及指定不同任務之間的依賴性等常見需求。第6章,Operations,將提供在應用程序中使用操作的更深入的討論。

2.2.3 BlockOperation

有時候,你會發現自己在開發一個大量使用操作的應用程序,但卻需要一個更簡單的、類似gcd的閉包。如果您不想也創建一個DispatchQueue,那么您可以使用BlockOperation類。
BlockOperation子類為您創建操作,并管理一個或多個閉包在默認全局隊列上的并發執行。但是,作為一個實際的Operation子類,您可以利用操作的所有其他特性。

注意:塊操作并發運行。如果需要它們串行運行,則需要設置一個分派隊列。

2.3 “你應該用哪一種?”

對于你應該在應用程序中使用GCD還是操作,并沒有明確的指示。對于你只需要執行和忘記的簡單任務,GCD更容易使用。當您需要跟蹤作業或維護取消作業的能力時,操作提供了更多的功能。

如果您只是處理需要執行的方法或代碼塊,那么GCD是一個合適的選擇。如果您使用的對象需要封裝數據和功能,那么您更有可能使用Operations。一些開發人員甚至極端地說,你應該總是使用Operations,因為它是建立在GCD之上的,而蘋果的指導說,總是使用提供的最高級別的抽象。

在一天結束的時候,你應該使用在那個時候最有意義的技術,并且為你的項目或者特定的用例提供最大的長期可持續性。
在下一章中,您將深入了解Grand Central Dispatch是如何工作的,了解線程和隊列之間的區別,并確定在應用程序中實現并發時可能出現的一些復雜性。

2.4 從這里到哪里去

當然是翻到下一章了!本書的其余部分將詳細介紹中央調度和操作。當你讀完這本書的時候,你會對這兩種選擇都有一個堅實的了解,也會對如何選擇其中一種有一個更好的想法。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,362評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,013評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,346評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,421評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,146評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,534評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,585評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,767評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,318評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,074評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,258評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,828評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,486評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,916評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,156評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,993評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,234評論 2 375

推薦閱讀更多精彩內容