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 条评论
登录 后参与评论

相关文章

来自专栏应用案例

Hexo博客的安装部署及多电脑同步

Hexo安装教程很多,我这里尽可能的讲的细一些,把容易踩坑的地方以及后期多电脑同步所遇到的问题列出来,以便给自己及大家参考。本文主要讲解安装部署后源文件同步问题...

1.1K7
来自专栏小狼的世界

利用AWStat+JAWStat进行Apache访问日志分析

Apache的访问日志中会记录服务器所处理的所有请求,对apache的访问日志进行分析是一种比较传统的形式。虽然现在很多第三方的统计分析工具提供了嵌入到页面中的...

952
来自专栏奔跑的蛙牛技术博客

数据库编程

某些jdbc的jar文件自动注册为jar文件,不支持的话需要手动注册,可以在java程序注册,可以通过命令行注入

863
来自专栏施炯的IoT开发专栏

Windows 10 IoT Serials 6 - 如何修改IoTStartupOnBoot.cmd文件

    使用Windows 10 IoT Core系统的朋友应该会比较熟悉IoTStartupOnBoot.cmd文件,该文件是系统启动以后加载的批处理文件,一...

2248
来自专栏ytkah

thinkcmf安装教程与目录结构详解 快速上手版

  最近接了一个建站项目,要求用thinkcmf来搭建,ytkah在想php都大致一样吧,快速地下载安装包,可是!怎么安装呢?没看到安装指引文件或目录,查看了安...

3794
来自专栏武培轩的专栏

当你在浏览器地址栏输入一个URL后回车,将会发生的事情?

当我们在浏览器的地址栏输入 www.cnblogs.com ,然后回车,回车到看到页面到底发生了什么呢? 域名解析 --> 发起TCP的3次握手 --> 建立T...

3287
来自专栏韩伟的专栏

看图说话用Eclipse写C++

1) Eclipse CDT介绍 Eclipse是开源的IDE中最流行的一个,它本身是一个JAVA程序,也就是说他可以运行在windows/linux/ma...

2784
来自专栏月牙寂

k8s源码分析-----kube-proxy(1)Config

第一时间获取文章,可以关注本人公众号 月牙寂道长 yueyajidaozhang

2867
来自专栏性能与架构

HBase 的存储结构

HBase 中的表常常是超级大表,这么大的表,在 HBase 中是如何存储的呢? HBase 会对表按行进行切分,划分为多个区域块儿,每个块儿名为 HRegi...

3547
来自专栏云计算教程系列

如何在Ubuntu 16.04上建立一个Jekyll开发网站

Jekyll是一个静态站点生成器,它有内容管理系统(CMS)的一些优点,同时避免了此类数据库驱动的站点引入的性能和安全问题。它具有“博客意识”,并包含处理日期组...

1216

扫码关注云+社区