在 iOS 中實現併發最有效的方法是什麼?
在 iOS 開發中,有多種技術可用於實現併發,本文將介紹不同的方法以及一些示例。您將學習關於 Grand Central Dispatch 和 NSOperationQueue 技術以及示例。
什麼是 iOS 中的併發?
在 iOS 應用程式中,您可以透過作業系統採用同時執行多個任務或執行緒的能力。在 iOS 中,主要透過使用 Grand Central Dispatch (GCD) 和 NSOperationQueue 來實現併發。
開發人員可以透過利用併發來防止阻塞更新使用者介面的主執行緒。相反,他們可以併發地執行後臺活動,從而提高應用程式的整體效能。
Grand Central Dispatch (GCD)
在 iOS、macOS 和其他 Apple 作業系統中,Grand Central Dispatch (GCD) 是一個低級別的 C API,它提供對併發程序的有效、系統範圍的控制。它構建在較低級別的排程佇列和執行緒管理原語之上。
排程佇列是 GCD 用於組織任務的工具。排程佇列是一種資料結構,用於儲存必須執行的任務列表。工作執行緒可以執行已新增到佇列中的任務。
GCD 提供了幾種型別的佇列,包括
主排程佇列 − 此佇列在主佇列上執行任務。這就是為什麼大多數時候我們使用它來更新使用者介面。iOS 使用者大多數時候使用這種佇列來重新載入表格資料、更改標籤的內容或更改按鈕的狀態。
全域性排程佇列 − 這些佇列可用於同時執行所有型別的任務。這些佇列在整個系統中共享。此外,它們不需要主佇列來執行任何任務。
自定義排程佇列 − 為了仔細管理任務,開發人員可以建立自定義佇列。您可以建立自定義佇列以一次執行特定任務或任務組。
以下是一些如何在 iOS 中使用 GCD 的示例:
在主佇列上執行任務
這是在主佇列上非同步執行任務的語法。
DispatchQueue.main.async {
// write the code here to update the user interface.
}
在全域性佇列上執行任務
這是在後臺執行緒上非同步執行任務的語法。
DispatchQueue.global(qos: .background).async {
// Write the code to perform a background task
}
在自定義佇列上執行任務
這是在自定義佇列上非同步執行任務的語法。
let customQueue = DispatchQueue(label: "com.example.myqueue")
customQueue.async {
// write the code to perform the task
}
let customQueue = DispatchQueue(label: "com.example.myqueue")
customQueue.sync {
// write the code to perform the task
}
重要的是要記住,GCD 提供了其他功能,如屏障、組和訊號量。您可以使用這些工具等待多個活動完成、同步任務等等。QoS(服務質量)類指示任務的優先順序、它是否應在主執行緒或後臺執行緒上執行以及它應接收多少資源。
NSOperationQueue 或 OperationQueue
iOS 中使用更高級別的 Objective-C 介面 NSOperationQueue 來控制併發任務。它建立在 Grand Central Dispatch (GCD) 之上,提供了額外的功能,包括自動取消和程序之間的相互依賴關係。它在 Swift 中作為 OperationQueue 可訪問。
併發或序列執行的操作佇列稱為 NSOperationQueue 或 OperationQueue。操作是可以在併發或序列執行的單個工作單元,例如方法呼叫。佇列允許新增操作,並且根據其優先順序和依賴關係,佇列將選擇執行它們的順序。
以下是一些如何在 Swift 中使用 NSOperationQueue 的示例:
建立操作佇列
在此步驟中,您將建立一個自定義操作佇列來執行任務。
let operationQueue = OperationQueue()
Add an operation to the queue:
let operation = BlockOperation {
// code to perform the task
}
operationQueue.addOperation(operation)
將多個操作新增到佇列
在此步驟中,您將向佇列新增不同的操作以執行它們。
let operation1 = BlockOperation {
// code to perform task 1
}
let operation2 = BlockOperation {
// code to perform task 2
}
operationQueue.addOperations([operation1, operation2], waitUntilFinished: false)
在操作之間新增依賴關係
在此步驟中,您可以看到如何在佇列中新增操作之間的依賴關係。
let operation1 = BlockOperation {
// code to perform task 1
}
let operation2 = BlockOperation {
// code to perform task 2
}
operation2.addDependency(operation1)
operationQueue.addOperations([operation1, operation2], waitUntilFinished: false)
設定最大併發運算元
operationQueue.maxConcurrentOperationCount = 2
您應該注意,與 DispatchQueue 相比,NSOperationQueue 更加強大和高階。這種方法為您提供了更多對操作的控制權,例如您可以設定優先順序、暫停或取消它們,並且您可以管理操作之間的依賴關係。總的來說,如果沒有特定的理由選擇 DispatchQueue,您可以使用 NSOperationQueue。
NSThread
Swift 在 iOS 中建立和管理執行緒是透過 NSThread 類(Foundation 框架)實現的。它只應在 NSOperationQueue 和 GCD(Grand Central Dispatch)不提供所需功能時使用,因為它是一個較低級別的 API。
執行緒是程式中透過程式僅遵循一條執行路徑的獨立“控制流”。用於儲存每個執行緒執行狀態的堆疊對於該執行緒是唯一的。
核心動畫
Core Animation 框架提供硬體加速的高效能動畫。它可以用於為您的 iOS 應用程式製作流暢的動畫,因為它建立在 GCD 之上。
結論
您可以在 iOS 作業系統上以併發方式執行多個任務或執行緒。此過程稱為併發。使用 iOS,您可以透過多種方式在應用程式中實現和管理併發。這些方法包括 GCD(Grand Central Dispatch)、NSOperationQueue、NSThread 等。
併發在 iOS 中是必要的,因為它允許最有效地利用系統資源並透過允許同時執行多個程序來提高效能。這與一次一個形成對比。與中斷負責更新使用者介面的主執行緒相比,程式設計師可以併發地執行後臺程序。這提高了應用程式的整體效能。
請考慮啟動過多執行緒以及同步對共享資源的訪問可能帶來的開銷和潛在問題,並使用最適合您的應用程式特定需求的策略。
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP