在 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 中是必要的,因为它允许最有效地利用系统资源并通过允许同时运行多个进程来提高性能。这与一次一个形成对比。与中断负责更新用户界面的主线程相比,程序员可以并发地运行后台进程。这提高了应用程序的整体性能。

请考虑启动过多线程以及同步对共享资源的访问可能带来的开销和潜在问题,并使用最适合您的应用程序特定需求的策略。

更新于: 2023 年 2 月 28 日

2K+ 次查看

开启您的 职业生涯

通过完成课程获得认证

开始
广告