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

相关文章

来自专栏决胜机器学习

数据库专题(四) ——各类缓存技术

数据库专题(四) ——各类缓存技术 (原创内容,转载请注明来源,谢谢) 一、概述 缓存(Cache)技术原指高速数据,当CPU处理数据的时候,会先去缓存里面找...

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

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

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

1476
来自专栏我的博客

Nginx和Apache日志格式分析

1、nginx日志格式 log_format main ‘$remote_addr – $remote_user [$time_local] “$reques...

3755
来自专栏小狼的世界

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

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

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

数据库编程

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

1013
来自专栏武培轩的专栏

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

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

3457
来自专栏Java3y

Linux网络管理

答:杀死一个进程,应获得这个进程控制的权利,比如获得进程所属账户的权限;或者获得超级账户的权限。如果是peter账户,没有获得jason账户的权限,因此,杀死j...

2570
来自专栏difcareer的技术笔记

Android启动过程分析-从按下电源键到第一个用户进程[转载]正文

对Android最初的启动过程一直没有清晰的认识,看到一篇好文,转载一下: http://blog.jobbole.com/67931/ http://ww...

602
来自专栏ytkah

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

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

4464
来自专栏Java帮帮-微信公众号-技术文章全总结

Web-第二十五天 Maven学习一【悟空教程】

解决方案:maven对项目生命周期进行定义,规范,开发人员和测试人员使用maven软件完成构建。

1273

扫码关注云+社区