(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实现单例的更多相关文章

  1. GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例

    转:http://www.tuicool.com/articles/NVVnMn (1)GCD实现的同步异步.串行并行. ——同步sync应用场景:用户登录,利用阻塞 ——串行异步应用场景:下载等耗时 ...

  2. GCD同步异步 串行并行大解析

    /** 核心概念 任务:block里需要执行的操作 队列:把任务添加进入队列中,按照先进先出的原则来执行任务  串行队列:一个一个的执行 并行队列:可以让多个任务并发(同时)执行(自动开启多个线程同时 ...

  3. iOS多线程——同步异步串行并行

    串行并行异步同步的概念很容易让人混淆,关于这几个概念我在第一篇GCD中有解释,但是还不够清晰,所以这里重写一篇博客专门对这几个概念进行区分: 先说一下队列和任务: (1)队列分为串行和并行,任务的执行 ...

  4. iOS:GCD理解1(串行-并行、同步-异步)

    1.获取并行.创建串行 队列 1-1).获取 并行(全局) 队列 ,DISPATCH_QUEUE_PRIORITY_DEFAULT 为默认优先级. dispatch_queue_t global_qu ...

  5. GCD,用同步/异步函数,创建并发/串行队列

    队列  第一个参数:C语言字符串,标签 第二个参数: DISPATCH_QUEUE_CONCURRENT:并发队列 DISPATCH_QUEUE_SERIAL:串行队列 dispatch_queue_ ...

  6. iOS 开发多线程 —— GCD(1)

    本文是根据文顶顶老师的博客学习总结而来,如有不妥之处,还望指出.http://www.cnblogs.com/wendingding/p/3807716.html 概览: /* 纯c语言,提供了非常多 ...

  7. [深度思考]·为什么CNN是同步(并行)而RNN是异步(串行)的呢?

    为什么CNN是同步(并行)而RNN是异步(串行)的呢? 个人主页--> https://xiaosongshine.github.io/ 1.问题引出 CNN与RNN都是采用parameter ...

  8. 串行&并行&并发,同步&异步

    1. 串行&并行&并发 1.1 串行 这个非常好理解,字面意思,像串成一个串一样,顺序执行 上一个没执行完的话,后面的就必须无条件等待 一般情况就是一个线程里:任务一个接一个执行,类似 ...

  9. STM32学习笔记(五) USART异步串行口输入输出(轮询模式)

    学习是一个简单的过程,只要有善于发掘的眼睛,总能学到新知识,然而如何坚持不懈的学习却很困难,对我亦如此,生活中有太多的诱惑,最后只想说一句勿忘初心.闲话不多扯,本篇讲诉的是异步串行口的输入输出,串口在 ...

随机推荐

  1. cefSharp获取百度搜索结果页面的源码

    using CefSharp; using CefSharp.WinForms; using System; using System.Collections.Generic; using Syste ...

  2. ckeditor:基本使用方法

    引用网址:http://blog.sina.com.cn/s/blog_6961ba9b0102wwye.html 1.获得值 var editor=CKEDITOR.replace( 'editor ...

  3. poj2049

    优先队列广搜,有人说用SPFA,不知道怎么做的 #include <cstdio> #include <queue> #include <cmath> #inclu ...

  4. Node.js模块定义总结

    为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统.模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的.换言之,一个 Node.js 文件就是一个模块,这 ...

  5. ***解决UEditor编辑器无法插入第三方视频地址

    转:http://blog.csdn.net/qq_16241043/article/details/53894847 xssFilter导致插入视频异常,编辑器在切换源码的过程中过滤掉img的_ur ...

  6. has the wrong structure

    mysql 5.6升级到5.7之后报错 root@localhost:mysql.sock [test]>show variables like '%log%' ; ERROR 1682 (HY ...

  7. spark优化之临时目录

    官方是这样说的: Directory to use for "scratch" space in Spark, including map output files and RDD ...

  8. 006 jquery过滤选择器-----------(可见性过滤选择器)

    1.介绍 2.程序 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...

  9. 038 spark中使用sparksql对日志进行分析(属于小案例)

    一:使用sparksql开发 1.sparksql开发的两种方式 HQL:SQL语句开发 eq : sqlContext.sql("xxxx") DSL : sparkSql中Da ...

  10. js数组遍历some、foreach、map、filter、every、lastIndexOf、indexOf对比

    1. [...].some(ck)函数 对数组中每个元素执行一次ck函数,知道某个元素返回true,则直接返回true.如果都返回false,则返回false 检查整个数组中是否有满足ck函数的元素. ...