(1)GCD实现的同步异步、串行并行。

——同步sync应用场景:用户登录,利用堵塞

——串行异步应用场景:下载等耗时间的任务

  1. /**
  2. * 由于是异步。所以开通了子线程。可是由于是串行队列,所以仅仅须要开通1个子线程(2),它们在子线程中顺序运行。
  3.  
  4. 最经常使用。
  5. */
  6. -(void)gcdDemo1{
  7. dispatch_queue_t q1=dispatch_queue_create("com.hellocation.gcdDemo", DISPATCH_QUEUE_SERIAL);
  8. for (int i=0; i<10; i++) {
  9. dispatch_async(q1, ^{
  10. NSLog(@"%@",[NSThread currentThread]);
  11. });
  12. }
  13. }
  14. /**
  15. * 由于是异步。所以开通了子线程,且由于是并行队列,所以开通了好多个子线程,详细几个,无人知晓,看运气。
  16.  
  17. 线程数量无法控制,且浪费。
  18. */
  19. -(void)gcdDemo2{
  20. dispatch_queue_t q2=dispatch_queue_create("com.hellocation.gcdDemo", DISPATCH_QUEUE_CONCURRENT);
  21. for (int i=0; i<10; i++) {
  22. dispatch_async(q2, ^{
  23. NSLog(@"%@",[NSThread currentThread]);
  24. });
  25. }
  26. }
  27. /**
  28. * 由于是同步,所以不管是并行队列还是串行队列,都是在主线程中运行
  29. */
  30. -(void)gcdDemo3{
  31. dispatch_queue_t q1=dispatch_queue_create("com.hellocation.gcdDemo", DISPATCH_QUEUE_SERIAL);
  32. for (int i=0; i<10; i++) {
  33. dispatch_sync(q1, ^{
  34. NSLog(@"%@",[NSThread currentThread]);
  35. });
  36. }
  37. }
  38. /**
  39. * 全局队列和并行队列相似(全局队列不须要创建直接get就可以,而导致其没有名字。不利于兴许调试)
  40. */
  41. -(void)gcdDemo5{
  42. dispatch_queue_t q=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
  43. for (int i=0; i<10; i++) {
  44. dispatch_sync(q, ^{
  45. NSLog(@"%@",[NSThread currentThread]);
  46. });
  47. }
  48. for (int i=0; i<10; i++) {
  49. dispatch_async(q, ^{
  50. NSLog(@"%@",[NSThread currentThread]);
  51. });
  52. }
  53. }
  54. /**
  55. * 由于是主线程。所以异步任务也会在主线程上运行(1)。
  56.  
  57. 而假设是同步任务,则堵塞了。由于主线程一直会在运行。所以后米的任务永远不会被运行。
  58. * 主要用处,是更新UI。更新UI一律在主线程上实现
  59. */
  60. -(void)gcdDemo6{
  61. dispatch_queue_t q=dispatch_get_main_queue();
  62. for (int i=0; i<10; i++) {
  63. dispatch_sync(q, ^{
  64. NSLog(@"%@",[NSThread currentThread]);
  65. });
  66. }
  67. // for (int i=0; i<10; i++) {
  68. // dispatch_async(q, ^{
  69. // NSLog(@"%@",[NSThread currentThread]);
  70. // });
  71. // }
  72. }

(2)NSOperation和NSOperationQueue实现的线程管理

  1. /**
  2. * 1、仅仅要是自己创建的队列,加入进来的操作(此处是block操作),都在子线程上(2)
  3. * 2、仅仅要是在主队列中,加入进来的操作,都在主线程上(1)
  4. * 两个队列不能同一时候抢一个任务操作
  5. */
  6. -(void)opDemo1{
  7. NSOperationQueue *queue=[[NSOperationQueue alloc]init];
  8. NSBlockOperation *b=[NSBlockOperation blockOperationWithBlock:^{
  9. NSLog(@"%@",[NSThread currentThread]);
  10. }];
  11. [queue addOperation:b];
  12. [[NSOperationQueue mainQueue]addOperation:b];
  13. }
  14. /**
  15. * 同上
  16. */
  17. -(void)opDemo2{
  18. NSInvocationOperation *i=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(helloWorld) object:nil];
  19. NSOperationQueue *queue=[[NSOperationQueue alloc]init];
  20. [queue addOperation:i];
  21. [[NSOperationQueue mainQueue]addOperation:i];
  22. }
  23.  
  24. -(void)helloWorld{
  25. NSLog(@"hello,world!");
  26. }
  27. /**
  28. * 依赖关系:(1)能够保证运行顺序,也使得开的子线程不会太多;(2)能够跨队列。而串行是不能够跨队列的,如最后更新UI则变成在主队列中。
  29. * 这是NSOperation(NSBlockOperation和NSInvocationOperation)和NSOperationQueue的优势
  30. */
  31. -(void)opDemo3{
  32. NSBlockOperation *op1=[NSBlockOperation blockOperationWithBlock:^{
  33. NSLog(@"下载图片 %@",[NSThread currentThread]);
  34. }];
  35. NSBlockOperation *op2=[NSBlockOperation blockOperationWithBlock:^{
  36. NSLog(@"修饰图片 %@",[NSThread currentThread]);
  37. }];
  38. NSBlockOperation *op3=[NSBlockOperation blockOperationWithBlock:^{
  39. NSLog(@"保存图片 %@",[NSThread currentThread]);
  40. }];
  41. NSBlockOperation *op4=[NSBlockOperation blockOperationWithBlock:^{
  42. NSLog(@"更新UI %@",[NSThread currentThread]);
  43. }];
  44. [op4 addDependency:op3];
  45. [op3 addDependency:op2];
  46. [op2 addDependency:op1];
  47. NSOperationQueue *queue=[[NSOperationQueue alloc]init];
  48. //设置同一时刻最大开启的线程数,这是NSOperationQueue特有的
  49. [queue setMaxConcurrentOperationCount:2];
  50. [queue addOperation:op1];
  51. [queue addOperation:op2];
  52. [queue addOperation:op3];
  53. [[NSOperationQueue mainQueue]addOperation:op4];
  54. }

(3)单例的实现(手写单例要求)dispatch_once运用。即重写类的allocWithZone方法

  1. @implementation WPObject
  2. +(instancetype)allocWithZone:(struct _NSZone *)zone{
  3. static WPObject *insta;
  4. static dispatch_once_t onceToken;
  5. dispatch_once(&onceToken, ^{
  6. insta=[super allocWithZone:zone];
  7. });
  8. return insta;
  9. }
  10. @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. 纠正几个NANDFLASH很容易犯的错误【转】

    转自:https://blog.csdn.net/pengrui18/article/details/32337297 今天在看别人如何根据物理地址计算NANDFLASH的列地址(column add ...

  2. Linux本地解析文件/etc/hosts说明【原创】

    windows的域名本地解析文件hosts是可以一个域名对多个IP,如果有一个IP有问题,可以去解析到其他IP Linux的本地解析文件/etc/hosts,是否也可以这样呢.下面做了个测试 先看一下 ...

  3. js input输入框的总结

    一.输入框只能输入数字 原文:https://www.cnblogs.com/sese/p/5872144.html 分享下js限制输入框中只能输入数字的方法,包括整数与小数,分享几个例子,有需要的朋 ...

  4. Android Studio之代码提示快捷键冲突设置

    1.原代码提示快捷键为:Ctrl+空格,与Windows输入法冲突,所以将代码提示快捷键设置为:Ctrl+反斜杠.

  5. poj1093

    题意:给出一个句子和要求整理后每行包含的字符数,要求将其整理为一种总badness最小的形式.设每个空格长度为n,单个空格的badness计算公式为(n-1)^2.总badness等于所有空格的bad ...

  6. vs2010下sort比较函数链接错误问题

    环境:win7 + vs2010 + C++ 实现vector的sort算法,在类的头文件中写入比较函数时会出现链接错误: error LNK2005: "bool __cdecl comp ...

  7. html屏幕旋转事件监听

    近期做微信服务号开发,在做图片展示的时候需要横竖屏的检测实现图片大小不同的展示. 添加屏幕旋转事件侦听,可随时发现屏幕旋转状态(左旋.右旋还是没旋). 摘自:http://bbs.phonegap10 ...

  8. 【AtCoder】Tenka1 Programmer Contest(C - F)

    C - Align 考的时候,我大胆猜了结论,就是一小一大一小一大这么排 证明的话,由于我们总是要加上相邻的最大值而减去最小值,我们就让最大值都保持在前面 如果长度为奇数,要么就是大小大小大,要么是小 ...

  9. spring配置文件详解以及beans:beans标签

    第一行的意思就是你这个文件的默认schema为security,所以你的beans定义就需要加上前缀beans 一般的定义文件默认都是beans: 下面是spring配置文件的详解: 转自:http: ...

  10. python常用库安装网址

    python常用库安装网址如下: http://pypi.python.org/pypi