iOS – 多线程的几种方式

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

前言

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 {
// 同步执行的任务
}
let queue = DispatchQueue(label: "测试 Grand Central Dispatch")



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




queue.sync {
    // 同步执行的任务
}
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)
let queue = OperationQueue()



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




queue.addOperation(operation)
let queue = OperationQueue() let operation = BlockOperation { // 任务代码 } queue.addOperation(operation)

Thread(线程):

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

OperationQueue 的便捷方法:

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




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

DispatchWorkItem:

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




DispatchQueue.global().async(execute: workItem)
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() {
// 在后台线程执行任务
}
self.performSelector(inBackground: #selector(backgroundTask), with: nil)



@objc func backgroundTask() {
    // 在后台线程执行任务
}
self.performSelector(inBackground: #selector(backgroundTask), with: nil) @objc func backgroundTask() { // 在后台线程执行任务 }

DispatchQueue.concurrentPerform:

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

结尾

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

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYkeJDPc' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片