【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例
(1)GCD实现的同步异步、串行并行。
——同步sync应用场景:用户登录,利用堵塞
——串行异步应用场景:下载等耗时间的任务
- /**
- * 由于是异步。所以开通了子线程。可是由于是串行队列,所以仅仅须要开通1个子线程(2),它们在子线程中顺序运行。
- 最经常使用。
- */
- -(void)gcdDemo1{
- dispatch_queue_t q1=dispatch_queue_create("com.hellocation.gcdDemo", DISPATCH_QUEUE_SERIAL);
- for (int i=0; i<10; i++) {
- dispatch_async(q1, ^{
- NSLog(@"%@",[NSThread currentThread]);
- });
- }
- }
- /**
- * 由于是异步。所以开通了子线程,且由于是并行队列,所以开通了好多个子线程,详细几个,无人知晓,看运气。
- 线程数量无法控制,且浪费。
- */
- -(void)gcdDemo2{
- dispatch_queue_t q2=dispatch_queue_create("com.hellocation.gcdDemo", DISPATCH_QUEUE_CONCURRENT);
- for (int i=0; i<10; i++) {
- dispatch_async(q2, ^{
- NSLog(@"%@",[NSThread currentThread]);
- });
- }
- }
- /**
- * 由于是同步,所以不管是并行队列还是串行队列,都是在主线程中运行
- */
- -(void)gcdDemo3{
- dispatch_queue_t q1=dispatch_queue_create("com.hellocation.gcdDemo", DISPATCH_QUEUE_SERIAL);
- for (int i=0; i<10; i++) {
- dispatch_sync(q1, ^{
- NSLog(@"%@",[NSThread currentThread]);
- });
- }
- }
- /**
- * 全局队列和并行队列相似(全局队列不须要创建直接get就可以,而导致其没有名字。不利于兴许调试)
- */
- -(void)gcdDemo5{
- dispatch_queue_t q=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
- for (int i=0; i<10; i++) {
- dispatch_sync(q, ^{
- NSLog(@"%@",[NSThread currentThread]);
- });
- }
- for (int i=0; i<10; i++) {
- dispatch_async(q, ^{
- NSLog(@"%@",[NSThread currentThread]);
- });
- }
- }
- /**
- * 由于是主线程。所以异步任务也会在主线程上运行(1)。
- 而假设是同步任务,则堵塞了。由于主线程一直会在运行。所以后米的任务永远不会被运行。
- * 主要用处,是更新UI。更新UI一律在主线程上实现
- */
- -(void)gcdDemo6{
- dispatch_queue_t q=dispatch_get_main_queue();
- for (int i=0; i<10; i++) {
- dispatch_sync(q, ^{
- NSLog(@"%@",[NSThread currentThread]);
- });
- }
- // for (int i=0; i<10; i++) {
- // dispatch_async(q, ^{
- // NSLog(@"%@",[NSThread currentThread]);
- // });
- // }
- }
(2)NSOperation和NSOperationQueue实现的线程管理
- /**
- * 1、仅仅要是自己创建的队列,加入进来的操作(此处是block操作),都在子线程上(2)
- * 2、仅仅要是在主队列中,加入进来的操作,都在主线程上(1)
- * 两个队列不能同一时候抢一个任务操作
- */
- -(void)opDemo1{
- NSOperationQueue *queue=[[NSOperationQueue alloc]init];
- NSBlockOperation *b=[NSBlockOperation blockOperationWithBlock:^{
- NSLog(@"%@",[NSThread currentThread]);
- }];
- [queue addOperation:b];
- [[NSOperationQueue mainQueue]addOperation:b];
- }
- /**
- * 同上
- */
- -(void)opDemo2{
- NSInvocationOperation *i=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(helloWorld) object:nil];
- NSOperationQueue *queue=[[NSOperationQueue alloc]init];
- [queue addOperation:i];
- [[NSOperationQueue mainQueue]addOperation:i];
- }
- -(void)helloWorld{
- NSLog(@"hello,world!");
- }
- /**
- * 依赖关系:(1)能够保证运行顺序,也使得开的子线程不会太多;(2)能够跨队列。而串行是不能够跨队列的,如最后更新UI则变成在主队列中。
- * 这是NSOperation(NSBlockOperation和NSInvocationOperation)和NSOperationQueue的优势
- */
- -(void)opDemo3{
- NSBlockOperation *op1=[NSBlockOperation blockOperationWithBlock:^{
- NSLog(@"下载图片 %@",[NSThread currentThread]);
- }];
- NSBlockOperation *op2=[NSBlockOperation blockOperationWithBlock:^{
- NSLog(@"修饰图片 %@",[NSThread currentThread]);
- }];
- NSBlockOperation *op3=[NSBlockOperation blockOperationWithBlock:^{
- NSLog(@"保存图片 %@",[NSThread currentThread]);
- }];
- NSBlockOperation *op4=[NSBlockOperation blockOperationWithBlock:^{
- NSLog(@"更新UI %@",[NSThread currentThread]);
- }];
- [op4 addDependency:op3];
- [op3 addDependency:op2];
- [op2 addDependency:op1];
- NSOperationQueue *queue=[[NSOperationQueue alloc]init];
- //设置同一时刻最大开启的线程数,这是NSOperationQueue特有的
- [queue setMaxConcurrentOperationCount:2];
- [queue addOperation:op1];
- [queue addOperation:op2];
- [queue addOperation:op3];
- [[NSOperationQueue mainQueue]addOperation:op4];
- }
(3)单例的实现(手写单例要求)dispatch_once运用。即重写类的allocWithZone方法
- @implementation WPObject
- +(instancetype)allocWithZone:(struct _NSZone *)zone{
- static WPObject *insta;
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- insta=[super allocWithZone:zone];
- });
- return insta;
- }
- @end
【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例的更多相关文章
- GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例
转:http://www.tuicool.com/articles/NVVnMn (1)GCD实现的同步异步.串行并行. ——同步sync应用场景:用户登录,利用阻塞 ——串行异步应用场景:下载等耗时 ...
- GCD同步异步 串行并行大解析
/** 核心概念 任务:block里需要执行的操作 队列:把任务添加进入队列中,按照先进先出的原则来执行任务 串行队列:一个一个的执行 并行队列:可以让多个任务并发(同时)执行(自动开启多个线程同时 ...
- iOS多线程——同步异步串行并行
串行并行异步同步的概念很容易让人混淆,关于这几个概念我在第一篇GCD中有解释,但是还不够清晰,所以这里重写一篇博客专门对这几个概念进行区分: 先说一下队列和任务: (1)队列分为串行和并行,任务的执行 ...
- iOS:GCD理解1(串行-并行、同步-异步)
1.获取并行.创建串行 队列 1-1).获取 并行(全局) 队列 ,DISPATCH_QUEUE_PRIORITY_DEFAULT 为默认优先级. dispatch_queue_t global_qu ...
- GCD,用同步/异步函数,创建并发/串行队列
队列 第一个参数:C语言字符串,标签 第二个参数: DISPATCH_QUEUE_CONCURRENT:并发队列 DISPATCH_QUEUE_SERIAL:串行队列 dispatch_queue_ ...
- iOS 开发多线程 —— GCD(1)
本文是根据文顶顶老师的博客学习总结而来,如有不妥之处,还望指出.http://www.cnblogs.com/wendingding/p/3807716.html 概览: /* 纯c语言,提供了非常多 ...
- [深度思考]·为什么CNN是同步(并行)而RNN是异步(串行)的呢?
为什么CNN是同步(并行)而RNN是异步(串行)的呢? 个人主页--> https://xiaosongshine.github.io/ 1.问题引出 CNN与RNN都是采用parameter ...
- 串行&并行&并发,同步&异步
1. 串行&并行&并发 1.1 串行 这个非常好理解,字面意思,像串成一个串一样,顺序执行 上一个没执行完的话,后面的就必须无条件等待 一般情况就是一个线程里:任务一个接一个执行,类似 ...
- STM32学习笔记(五) USART异步串行口输入输出(轮询模式)
学习是一个简单的过程,只要有善于发掘的眼睛,总能学到新知识,然而如何坚持不懈的学习却很困难,对我亦如此,生活中有太多的诱惑,最后只想说一句勿忘初心.闲话不多扯,本篇讲诉的是异步串行口的输入输出,串口在 ...
随机推荐
- 纠正几个NANDFLASH很容易犯的错误【转】
转自:https://blog.csdn.net/pengrui18/article/details/32337297 今天在看别人如何根据物理地址计算NANDFLASH的列地址(column add ...
- Linux本地解析文件/etc/hosts说明【原创】
windows的域名本地解析文件hosts是可以一个域名对多个IP,如果有一个IP有问题,可以去解析到其他IP Linux的本地解析文件/etc/hosts,是否也可以这样呢.下面做了个测试 先看一下 ...
- js input输入框的总结
一.输入框只能输入数字 原文:https://www.cnblogs.com/sese/p/5872144.html 分享下js限制输入框中只能输入数字的方法,包括整数与小数,分享几个例子,有需要的朋 ...
- Android Studio之代码提示快捷键冲突设置
1.原代码提示快捷键为:Ctrl+空格,与Windows输入法冲突,所以将代码提示快捷键设置为:Ctrl+反斜杠.
- poj1093
题意:给出一个句子和要求整理后每行包含的字符数,要求将其整理为一种总badness最小的形式.设每个空格长度为n,单个空格的badness计算公式为(n-1)^2.总badness等于所有空格的bad ...
- vs2010下sort比较函数链接错误问题
环境:win7 + vs2010 + C++ 实现vector的sort算法,在类的头文件中写入比较函数时会出现链接错误: error LNK2005: "bool __cdecl comp ...
- html屏幕旋转事件监听
近期做微信服务号开发,在做图片展示的时候需要横竖屏的检测实现图片大小不同的展示. 添加屏幕旋转事件侦听,可随时发现屏幕旋转状态(左旋.右旋还是没旋). 摘自:http://bbs.phonegap10 ...
- 【AtCoder】Tenka1 Programmer Contest(C - F)
C - Align 考的时候,我大胆猜了结论,就是一小一大一小一大这么排 证明的话,由于我们总是要加上相邻的最大值而减去最小值,我们就让最大值都保持在前面 如果长度为奇数,要么就是大小大小大,要么是小 ...
- spring配置文件详解以及beans:beans标签
第一行的意思就是你这个文件的默认schema为security,所以你的beans定义就需要加上前缀beans 一般的定义文件默认都是beans: 下面是spring配置文件的详解: 转自:http: ...
- python常用库安装网址
python常用库安装网址如下: http://pypi.python.org/pypi