iOS - 多线程的几种方式

3,455 阅读3分钟

我正在参加「掘金·启航计划」

前言

iOS 中的多线程编程是为了提高应用程序的性能和响应性,避免主线程阻塞而引入的。多线程编程允许应用程序同时执行多个任务,从而提升用户体验和系统性能。以下是 iOS 中常用的多线程编程方式:

Grand Central Dispatch (GCD):

  • GCD 是一种基于队列的异步执行机制,可以方便地创建并发任务、串行和并行队列,并自动管理线程调度。
  • GCD 使用 Dispatch Queue 来管理任务的执行。有两种类型的队列:
    • Serial Queue(串行队列):按顺序执行任务,一个任务完成后再执行下一个任务。
    • Concurrent Queue(并行队列):可以同时执行多个任务。
  • GCD 提供了以下几种常用的函数:
    • dispatch_async:将任务提交到队列中异步执行。
    • dispatch_sync:将任务提交到队列中同步执行。
    • dispatch_group:用于管理一组相关的任务。
    • dispatch_barrier_async:将一个任务提交到队列中,等待前面的任务完成后再执行。
let queue = DispatchQueue(label: "测试 Grand Central Dispatch")

queue.async {
    // 异步执行的任务
}

queue.sync {
    // 同步执行的任务
}

image.png

NSOperation 和 NSOperationQueue:

  • NSOperation 和 NSOperationQueue 是基于 GCD 的更高级别的多线程编程接口,提供了对任务的封装和管理。
  • NSOperation 是一个抽象类,定义了一个可执行的任务,需要通过继承或使用子类(如 NSBlockOperation)来创建任务。
  • NSOperationQueue 是任务队列,用于管理和执行任务。可以通过设置最大并发数、优先级等属性来调整任务的执行方式。
let queue = OperationQueue()

let operation = BlockOperation {
    // 任务代码
}

queue.addOperation(operation)

Thread(线程):

  • iOS 中的 Thread 类代表一个执行线程,可以直接创建和管理线程。
  • 在线程中执行任务需要手动管理线程的生命周期和同步操作。
DispatchQueue.global().async {
    // 在后台线程执行任务
    DispatchQueue.main.sync {
        // 在主线程更新 UI
    }
}

OperationQueue 的便捷方法:

  • OperationQueue 提供了一些便捷方法来执行常见的并发任务,如异步下载、并发遍历等。
  • OperationQueue.main:获取主队列,用于在主线程上执行任务。
  • OperationQueue.global():获取全局队列,用于在后台线程上执行任务。
OperationQueue.main.addOperation {
    // 在主线程上执行任务
}

OperationQueue.global().addOperation {
    // 在后台线程上执行任务
}

DispatchWorkItem:

  • DispatchWorkItem 是一个包含要执行的代码块的任务对象,可以使用 GCD 的函数执行它。
  • DispatchWorkItem 提供了一些属性和方法,可以控制任务的执行和取消。
let workItem = DispatchWorkItem {
    // 任务代码
}

DispatchQueue.global().async(execute: workItem)

PerformSelector(inBackground:with:):

  • NSObject 类提供了一个 performSelector(inBackground:with:) 方法,可以在后台线程执行指定的方法。
  • 该方法会自动在后台线程中执行,并不需要手动管理线程。
self.performSelector(inBackground: #selector(backgroundTask), with: nil)

@objc func backgroundTask() {
    // 在后台线程执行任务
}

DispatchQueue.concurrentPerform:

  • DispatchQueue 提供了一个 concurrentPerform 函数,可以在多个线程上并发地执行指定的代码块。
  • concurrentPerform 函数会自动创建多个线程来执行任务,并等待任务完成后返回。
DispatchQueue.concurrentPerform(iterations: 10) { index in
    // 并发执行的任务
}

结尾

在实际应用中,需要根据具体情况选择适合的方式来处理并发任务,以提高应用程序的性能和响应性。需要注意的是,在进行多线程编程时,要遵循线程安全的原则,避免数据竞争和访问冲突问题。