iOS学习笔记——GCD

前言

当App需要进行计算量较大或耗时较长的工作时,多线程计算就必不可少。iOS为我们提供了一个比较方式的异步任务工具类——GCD。

GCD类似于一个线程池。我们设置好对应的模式,然后将任务放入等待队列即可。

基本概念

队列

一个存放任务的数据结构,队列遵循FIFO模式。队列分为并行队列串行队列

// 创建了一个标签是”queue0“、执行优先级为.default的并行队列
let queue0 = DispatchQueue(label: "queue0", qos: .default, attributes: .concurrent)
// label:队列标签
// qos:设置队列的优先级
// attributes:队列形式:默认串行,设置为.concurrent代表是并行队列
  • 串行队列
let queue2 = DispatchQueue(label: "queue2")
  • 并行队列
let queue1 = DispatchQueue(label: "queue1", attributes: .concurrent)

系统也为我们提供了一个公共的并行队列,获取方式:

DispatchQueue.global()

此外,主线程就是一个串行队列。

DispatchQueue.main

任务

任务就是一个代码块,用来实现我们需要的计算逻辑。我们使用时,将其放入队列中执行。

快速使用

        // 同步执行
        queue1.sync {
            for i in 100...110 {
                print("?\(i)")
            }
            print("1:\(Thread.current)")
        }
        // 异步执行
        queue1.async {
            for i in 1000...1010 {
                print("?\(i)")
            }
            print("1:\(Thread.current)")
        }

同步、异步、串行、并行

GCD运行方式

DispathWorkIten

当我们需要进行精确的任务先后关系控制时,我们可以用DispathWorkIten来实现。

// 队列1
let queue1 = DispatchQueue(label: "queue1")
   
// 任务1
let work1 = DispatchWorkItem {
  for i in 1...10 {
      print("?\(i)")
  }
  print("1:\(Thread.current)")
  
}
   
// 任务2
let work2 = DispatchWorkItem {
  for i in 1000...1010 {
      print("?\(i)")
  }
  print("2:\(Thread.current)")
}
   
   
// 第一种绑定方式
work1.notify(queue: queue1) {
  // 执行2
  work2.perform()
}
    
// 第二中绑定方式
work1.notify(queue: queue1, execute: work2)
    
// 第三种可以直接不创建work2,在闭包中执行work的工作
work1.notify(queue: queue1) {
  for i in 1000...1010 {
      print("?\(i)")
  }
  print("2:\(Thread.current)")
}
   
// 执行任务:
// 方式1:任务放在队列中并执行
queue1.async(execute: work1)
// 方式2:如果不指定队列,会在当前的队列中执行,如果在主线程中执行会造成线程阻塞
work1.perform()

如有问题,欢迎指正。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大闲人柴毛毛

Java并发编程的艺术(一)——并发编程需要注意的问题

并发是为了提升程序的执行速度,但并不是多线程一定比单线程高效,而且并发编程容易出错。若要实现正确且高效的并发,就要在开发过程中时刻注意以下三个问题: 上下文切换...

2855
来自专栏数据库

程序连接数据库响应慢!是 Thread pool 参数捣的鬼吗?

作者 | haoge0205 数据库版本:percona-mysql 5.6.16 在很长一段时间,都会出现程序连接数据库,出现响应慢的情况,正常在几到几十毫秒...

2298
来自专栏大大的微笑

Java线程池

       概述:         线程池,从字面含义来看是管理同一组同构工作线程的资源池。线程池与工作队列是密切相关的, 工作队列保存了所有等待执行的...

2066
来自专栏用户2442861的专栏

线程池模型[初级版]

现在用户新增加任务worker3,首先调用pool_add_worker(),把worker3插入等待队列:如图

421
来自专栏Java成长之路

线程的实现方式

本文主要介绍线程的3种实现方式和java线程的实现方式。线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配 和执行调度分开,各个进程既可以...

925
来自专栏Java Edge

Java与线程线程的实现内核线程(Kernel-Lever Thread,KLT)用户线程用户线程混合轻量级进程Java线程的实现.Java 线程Java线程调度

4138
来自专栏java一日一条

生产者消费者模式

在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。

531
来自专栏javathings

Java 线程状态有哪些?

1. 线程 start 方法执行后,并不表示该线程运行了,而是进入就绪状态,意思是随时准备运行,但是真正何时运行,是由操作系统决定的,代码并不能控制,

873
来自专栏hrscy

iOS多线程

进程是指系统中正在运行的一个应用程序。每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内。

713
来自专栏Java职业技术分享

java 中的 Executors 简介与多线程在网站上逐步优化的运用案例

忽略了自定义的ThreadFactory、callable和unconfigurable相关的方法

1274

扫码关注云+社区