多线程:Operation(二)
1. Operation 设置依赖关系
先看看如何设置operation的依赖关系。
啥叫依赖关系?有啥用啊?
打个比方咱们要做一个听音乐的付费App项目,需要经过登陆、付费、下载、播放四个步骤。其实一看就明白,这四个操作是有先后顺序的,但假如所有的操作都是多线程,咱们怎么控制顺序?
通过设置“优先级”?NO!优先级没有办法干这个事情。(相当于操作系统中的同步)
我们可以通过设置依赖关系,建立起先后的顺序。只有当一个 operation 所依赖的所有 operation 都执行完成时,这个 operation 才能开始执行。
并且,operation是可以跨队列建立依赖关系的噢!
需要小小注意的是,要先将operation的依赖关系建立好之后再添加到队列中。
代码很简单,请看:
fileprivate func startDepencyDemo() {
operationQueue.maxConcurrentOperationCount =
self.activityIndicator.startAnimating()
guard let url = URL(string: "https://placebeard.it/355/140") else {return }
let op1 = convenienceOperation(setImageView: imageView1, withURL: url)
let op2 = convenienceOperation(setImageView: imageView2, withURL: url)
op2.addDependency(op1)
let op3 = convenienceOperation(setImageView: imageView3, withURL: url)
op3.addDependency(op2)
let op4 = convenienceOperation(setImageView: imageView4, withURL: url)
op4.addDependency(op3)
DispatchQueue.global().async {
[weak self] in
self?.operationQueue.addOperations([op1,op2,op3,op4], waitUntilFinished: true)
DispatchQueue.main.async {
self?.activityIndicator.stopAnimating()
}
}
}
多线程:Operation(二)的更多相关文章
- [.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 利用多线程提高程序性能(中)
[.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 利用多线程提高程序性能(中) 本节要点: 上节介绍了多线程的基本使用方法和基本应用示例,本节深入介绍.NET ...
- Java多线程(二)关于多线程的CPU密集型和IO密集型这件事
点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更新中~ 正式篇: Java多线程(一) 什么是线程 Java多线程(二)关于多线程的CPU密集型和IO密集型这件事 Java多线程(三)如何 ...
- 简述Java多线程(二)
Java多线程(二) 线程优先级 Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程来执行. 优先级高的不一定先执行,大多数情况是这样的. 优 ...
- java多线程解读二(内存篇)
线程的内存结构图 一.主内存与工作内存 1.Java内存模型的主要目标是定义程序中各个变量的访问规则.此处的变量与Java编程时所说的变量不一样,指包括了实例字段.静态字段和构成数组对象的元素,但是不 ...
- 多线程编程之Linux环境下的多线程(二)
上一篇文章中主要讲解了Linux环境下多线程的基本概念和特性,本文将说明Linux环境下多线程的同步方式. 在<UNIX环境高级编程>第二版的“第11章 线程”中,提到了类UNIX系统中的 ...
- C#多线程(二)
一.线程池 每次创建一个线程,都会花费几百微秒级别的时间来创建一个私有的局部栈,每个线程默认使用1M的内存.这个可以在使用Thread类的构造函数时设置: new Thread(new ThreadS ...
- C# WinForm多线程(二)ThreadPool 与 Timer
本文接上文,继续探讨WinForm中的多线程问题,再次主要探讨threadpool 和timer 一 ThreadPool 线程池(ThreadPool)是一种相对较简单的方法,它适应于一些需要多个 ...
- Python中的多进程与多线程(二)
在上一章中,学习了Python多进程编程的一些基本方法:使用跨平台多进程模块multiprocessing提供的Process.Pool.Queue.Lock.Pipe等类,实现子进程创建.进程池(批 ...
- 多线程随笔二(Task)
Task类是.net 4.0新加进来的特性,对原有的Thread,ThreadPool做了进一步的封装,使得.net平台上的多线程编程变得更加方便.废话不多说,进入正题. 一. Task启动 Task ...
随机推荐
- BouncyCastle 密钥转换 - Java
转自: https://blog.csdn.net/a351945755/article/details/63707040 1. PKCS#8 转 PKCS#1 You will need Bounc ...
- DMA驱动框架
框架入口源文件:dma.c (可根据入口源文件,再按着框架到内核走一遍) 内核版本:linux_2.6.22.6 硬件平台:JZ2440 以下是驱动框架: 以下是驱动代码 dma.c : #i ...
- php 数值类型
一.整形 1. 常见的整形 echo 1234; // 十进制数 echo -123; // 负数 echo 0123; // 八进制数 (等于十进制 83) echo 0x1A; // 十六进制数 ...
- 关于eclipse调试时程序控制台不能自动打开
对于这个程序,在刚开始的时候,没有敲上22,29,33行的打印语句时,在调试的时候不会自动弹开控制台,所以一直在怀疑代码可能出错了.因此可以自己手动打开,但是如果敲上那些代码,系统可以自动弹开控制 ...
- innodb_flush_method理解【转】
innodb_flush_method这个参数控制着innodb数据文件及redo log的打开.刷写模式,对于这个参数,文档上是这样描述的: 有三个值:fdatasync(默认),O_DSYNC,O ...
- Lint——Android SDK提供的静态代码扫描工具
Lint和FindBugs一样,都是静态代码扫描工具,区别在于它是Android SDK提供的,会检查Android项目源文件的正确性.安全性.性能.可用性等潜在的bug并优化改进. 下图简单地描述了 ...
- 【剑指offer】数组中出现次数超过一半的数字
一.题目: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2 ...
- python的开发语言介绍
-开发语言: 高级语言:python.java.c#.php.GO.ruby.c++ ===>字节码 低级语言:c.汇编 ===>机器码 语言之间的对比: PHP:适用于写网页, ...
- (转)Springboot定时任务
在我们的项目开发过程中,经常需要定时任务来帮助我们来做一些内容,springboot默认已经帮我们实行了,只需要添加相应的注解就可以实现 1.pom包配置 pom包里面只需要引入springboot ...
- 如何使用向量代表文档doc或者句子sentence
1.“句向量”简介word2vec提供了高质量的词向量,并在一些任务中表现良好. 关于word2vec的原理可以参考这几篇论文: https://arxiv.org/pdf/1310.4546.pdf ...