36 Swift多线程编程新思路:GCD

简介: Swift多线程编程新思路:GCD

多线程编程新思路:GCD概览

GCD

  • 任务 + 队列
  • 易用
  • 效率
  • 性能

image.png

  • 创建管理Queue
  • 提交Job
  • Dispatch group
  • 管理Dispatch Object
  • 信号量Semaphore
  • 队列屏障Barrier
  • Dispatch Source
  • Queue Context数据
  • Dispatch I/O Channel
  • Dispatch Data对象

GCD-队列

  • 主队列:任务在主线程执行
  • 并行队列:任务会以先进先出的顺序入列和出列,但是因为多个任务可以并行执行,所以完成顺序是不一定的
  • 串行队列:任务会以先进先出的顺序入列和出列,但是同一时刻只会执行一个任务

GCD-队列API

  • Dispatch.main
  • Dispatch.global
  • DispatchQueue(label:, qos:, attributes:, autoreleaseFrequency:, target:)
  • queue.label
  • setTarget(queue: DispatchQueue?)

GCD-队列

image.png

  • 最终的目标队列都是主队列和全局队列
  • 如果把一个并行队列的目标队列设置为一个串行队列,那么并行队列将不再并行
  • 如果多个队列的目标队列都设置为同一个串行队列,那么这多个队列连同目标队列里的任务都将串行执行
  • 如果设置目标队列形成环了,结果是不可预期的
  • 如果在一个队列正在执行任务的时候更换目标队列,结果也是不可预期的

如何使用GCD:基本操作指南

GCD-基本操作

  • sync
  • async
  • asyncAfter

GCD-串行 vs 并行

image.png

GCD-同步 vs 异步

image.png

GCD-sync

  • 提交任务到当前队列里,并且直到任务执行完成,当前队列才会返回。

image.png

GCD-async

  • 调度一个任务去立即执行,但是不用等任务执行完当前队列就会返回

GCD-asyncAfter

  • 调度一个任务去多久之后执行,但是不用等任务执行完当前队列就会返回

image.png

//qos:优先级/服务质量//attributes: 指定队列是并行的还是串行的//autoreleaseFrequency: 频度//target: 指向哪种队列, 不设置就指向默认letqueue=DispatchQueue(label: "myQueue", qos:DispatchQos.default, attributes: DispatchQueue.Attributes.concurrent, autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency.inherit, target: nil)
queue.sync {
print("in queue sync")
}
queue.async {
sleep(1)
print("in queue async")
}
//deadline: 什么时候去执行  now代表立即执行queue.asyncAfter(deadline: .now() +1) {
print("in asyncAfter")
}
print("after invoke queue method")

深度使用GCD:高级特性指南

DispatchGroup

image.png

DispatchGroup - wait

image.png

DispatchGroup - notify

image.png

DispatchSource

  • 简单来说,dispatch source是一个监视某些类型事件的对象。当这些事发生时,它自动将一个task放入一个dispatch queue的执行例程中

  • Mach port send right state changes
  • Mach port receive right state changes
  • External process state change
  • File descriptor ready for read
  • File descriptor ready for write
  • Filesystem node event
  • POSIX signal
  • Custom timer
  • Custom event

DispatchSource - Time

image.png

深入理解GCD: 源码剖析

GCD - sync

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png








目录
相关文章
|
3月前
|
API Swift C语言
探索iOS开发:Swift中的异步编程与GCD应用
【8月更文挑战第4天】在iOS开发的海洋中,掌握Swift语言的航向是至关重要的。本文将引领你深入理解Swift中的异步编程概念,并借助Grand Central Dispatch(GCD)这一强大的工具,来简化并发编程的复杂性。我们将通过实际代码示例,展现如何在iOS应用中高效地管理后台任务和提升用户界面的响应性。
70 3
|
6月前
|
安全 调度 Swift
【Swift开发专栏】Swift中的多线程与并发编程
【4月更文挑战第30天】本文探讨Swift中的多线程与并发编程,分为三个部分:基本概念、并发编程模型和最佳实践。介绍了线程、进程、并发与并行、同步与异步的区别。Swift的并发模型包括GCD、OperationQueue及新引入的结构体Task和Actor。编写高效并发代码需注意任务粒度、避免死锁、使用线程安全集合等。Swift 5.5的并发模型简化了异步编程。理解并掌握这些知识能帮助开发者编写高效、安全的并发代码。
192 1
|
安全 前端开发 API
37 Swift如何保证线程安全和同步
Swift如何保证线程安全和同步
145 0
|
6月前
|
API 调度 iOS开发
多线程和异步编程:什么是 GCD(Grand Central Dispatch)?如何在 iOS 中使用 GCD?
多线程和异步编程:什么是 GCD(Grand Central Dispatch)?如何在 iOS 中使用 GCD?
71 1
|
安全 调度 C语言
iOS多线程之GCD-同步、异步、并发、串行、线程组、栅栏函数、信号量等全网最全的总结
iOS多线程之GCD-同步、异步、并发、串行、线程组、栅栏函数、信号量等全网最全的总结
942 1
|
Java Swift iOS开发
35 如何在Swift中创建一个线程
如何在Swift中创建一个线程
65 0
|
iOS开发
iOS中的多线程与GCD队列关系
iOS中的多线程与GCD队列关系
182 0
iOS中的多线程与GCD队列关系
|
缓存 程序员 调度
iOS开发多线程篇-GCD
上篇文章介绍了多线程是什么、线程的进程的区别,在这篇文章中,主要介绍iOS开发中多线程GCD的使用方式和注意事项,同时会给出几种多线程的案例。
|
数据库 iOS开发
ios多线程-GCD基本用法
ios中多线程有三种,NSTread, NSOperation,GCD 这篇就讲讲GCD的基本用法
|
安全 iOS开发
iOS多线程开发之深入GCD
iOS多线程开发之深入GCD
106 0
iOS多线程开发之深入GCD