在iOS中实现并发性的最有效方法是什么

在iOS中实现并发性的最有效方法是什么

在iOS开发中,有几种技术可用于实现并发性,你将在本文中看到不同的方法以及一些例子。你将通过实例了解Grand Central Dispatch和NSOperationQueue技术。

什么是iOS中的并发性?

在iOS应用程序中,你可以通过操作系统采用同时运行多个任务或线程的能力。 在iOS中,你主要通过使用Grand Central Dispatch(GCD)和NSOperationQueue来实现并发性

开发人员可以通过利用并发性来防止阻塞更新用户界面的主线程。相反,他们可以并发地进行后台活动,提高应用程序的整体性能。

大中央调度(GCD)

在iOS、macOS和其他苹果操作系统中,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(Quality of Service)类来表示。

NSOperationQueue 或 OperationQueue

更高级别的Objective-C接口NSOperationQueue在iOS中被用来控制并发任务。它建立在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

iOS中的Swift线程创建和管理是由NSThread(基础框架)这个类来实现的。只有当NSOperationQueue和GCD(Grand Central Dispatch)不能提供所需的功能时,才应该使用它,因为它是一个较低级别的API。

一个线程是通过程序的一个明显的控制 “流”,只遵循一条执行路径。用于保存每个线程的执行状态的堆栈对该线程来说是唯一的。

核心动画

一个名为Core Animation的框架提供了硬件加速的高性能动画。它可以用来为你的iOS应用制作流体动画,因为它是建立在GCD之上的。

总结

你可以在iOS操作系统上以并发的方式执行多个任务或线程。这个过程被称为并发性。在iOS中,你可以通过各种方式在你的应用程序中实现和管理并发性。这些方法是GCD(Grand Central Dispatch)、NSOperationQueue、NSThread等等。

并发是iOS中的一个必要条件,因为它允许最有效地使用系统资源,并通过允许多个进程同时运行来提高性能。这是与一次一个相比的。由于并发性,程序员可以同时运行后台进程,而不是打断负责更新用户界面的主线程。这提高了应用程序的整体性能。

考虑到启动太多的线程和对共享资源的访问同步性差可能产生的开销和潜在问题,并使用最适合你的应用程序的具体要求的策略。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

Swift 教程