美文网首页
36 Swift多线程编程新思路:GCD

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

作者: 为了自由的白菜 | 来源:发表于2023-03-26 12:02 被阅读0次

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

GCD

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

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

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

GCD-基本操作

  • sync
  • async
  • asyncAfter

GCD-串行 vs 并行

image-20230308211127695.png

GCD-同步 vs 异步

image-20230308211215763.png

GCD-sync

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

GCD-async

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

GCD-asyncAfter

  • 调度一个任务去多久之后执行,但是不用等任务执行完当前队列就会返回
image-20230308211929480.png
//qos:优先级/服务质量
//attributes: 指定队列是并行的还是串行的
//autoreleaseFrequency: 频度
//target: 指向哪种队列, 不设置就指向默认
let queue = 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-20230311215232022.png

DispatchGroup - wait

image-20230311215600533.png

DispatchGroup - notify

image-20230311215846452.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-20230311220622061.png

深入理解GCD: 源码剖析

GCD - sync

image-20230312092514394.png image-20230312092536616.png image-20230312092548471.png image-20230312092624898.png image-20230312092644982.png image-20230312092735557.png image-20230312093017053.png image-20230312093134041.png image-20230312093213966.png image-20230312093315603.png

相关文章

  • OC-多线程

    多线程 官方文档:线程编程指南GCD源码:https://github.com/apple/swift-corel...

  • Swift多线程:GCD进阶,单例、信号量、任务组

    Swift多线程:GCD进阶,单例、信号量、任务组 Swift多线程:GCD进阶,单例、信号量、任务组

  • 多线程

    参考文章:iOS多线程--彻底学会多线程之『GCD』Swift 3.0 GCD和DispatchQueue 使用解...

  • GCD

    iOS多线程 Swift4 GCD深入解析swift GCD 的一些高级用法GCD 之线程组(Dispatch G...

  • GCD in Swift 3

    本文假设你有一定的 GCD 和 Swift 基础。 iOS 下的多线程编程技术从底层往上分别是 NSThread、...

  • Swift 4 Cheat Sheet Advanced

    Swift 4 Cheat Sheet Advanced @(编程笔记)[Swift] Singleton GCD...

  • 多线程编程4 - GCD

    原文: 多线程编程4 - GCD 一、简介在iOS所有实现多线程的方案中,GCD应该是最有魅力的,因为GCD本身是...

  • 线程

    iOS 多线程:『GCD』详尽总结 NSThread详解 IOS 多线程编程 『NSOperation、NSOpe...

  • FLAnimatedImageView加载卡顿问题。

    GCD 的调用 转载“iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用”

  • Swift- 多线程编程GCD

    参考文章:1、Swift 3使用GCD和DispatchQueues2、线程死锁 基本概念: 串行队列:只有一个线...

网友评论

      本文标题:36 Swift多线程编程新思路:GCD

      本文链接:https://www.haomeiwen.com/subject/cpmordtx.html