iOS多线程GCD

来源:互联网 发布:淘宝如何处理中差评 编辑:程序博客网 时间:2024/06/09 20:55

GCDGrand Central Dispatch : 牛逼的中枢调度器。苹果自带,纯C语言实现,提供了非常多且强大的函数,它可以提高代码的执行效率与多核的利用率。

一、GCD的基本使用

1、GCD中的两个核心概念:
任务执行什么任务.
队列用来存放任务. (用来调度任务)
2、GCD使用的2个步骤:
1.任务. (确定想做的事情)
2.任务添加到队列中.
GCD自动队列中的任务取出, 放到对应的线程中执行.
遵循队列的FIFO原则: 先进先出.
3、同步和异步的区别: (是否开启新线程)
同步:在当前线程中执行.
异步:在另一条线程中执行.
4、并行与串行队列 : (任务的执行方式)
并行对列:异步情况下, 让多个任务并发执行.
串行队列:一个任务执行完后,再执行下一个任务.

队列又分为几种:自定义的队列、全局队列、主队列
基本使用代码如下:

[objc] view plaincopy
  1. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{  
  2.     [self gcdDemo4];  
  3. }  
  4.   
  5. #pragma mark - 串行队列  
  6. - (void)gcdDemo1{  
  7.     // 1. 串行队列  
  8.     // 在使用GCD的时候,先敲dispatch  
  9.     // 在C语言中,定义对象通常是以 _t 或者 Ref 结尾的  
  10.     dispatch_queue_t q = dispatch_queue_create("myQueueName", DISPATCH_QUEUE_SERIAL); //DISPATCH_QUEUE_SERIAL 的值为 NULL  
  11.       
  12.     NSLog(@"%@", [NSThread currentThread]);  
  13.       
  14.     // 2. 同步任务 sync(实际开发中没用)  
  15.     for (int i = 0; i < 10; i++) {  
  16.         dispatch_sync(q, ^{  
  17.             NSLog(@"%@ - %d", [NSThread currentThread], i);  
  18.         });  
  19.     }  
  20.       
  21.     // 2. 异步任务 async,能够开线程  
  22.     // 串行队列中,异步任务最多只能开一条线程,所有任务顺序执行!  
  23.     // 串行队列,异步任务,在多线程中,是斯坦福大学最推荐的一种多线程方式!  
  24.     // 优点:将任务放在其他线程中工作,每个任务顺序执行,便于调试  
  25.     // 缺点:并发能力不强,最多只能使用一条线程!  
  26.     for (int i = 0; i < 10; i++) {  
  27.         dispatch_async(q, ^{  
  28.             NSLog(@"%@ - %d", [NSThread currentThread], i);  
  29.         });  
  30.     }  
  31. }  
  32.   
  33.   
  34. #pragma mark - 并行队列  
  35. - (void)gcdDemo2{  
  36.     // 1. 并行队列  
  37.     dispatch_queue_t q = dispatch_queue_create("myQueueName", DISPATCH_QUEUE_CONCURRENT);  
  38.       
  39.     // 非ARC中,需要自己释放队列  
  40.     //    dispatch_release(q);  
  41.       
  42.     // 2. 同步任务,不会开启新的线程  
  43.     // 在实际开发中,同步任务可以保证执行完成之后,才让后续的异步任务开始执行,用于控制任务之间的先后顺序,如在后台线程中,处理“用户登录”等  
  44.     for (int i = 0; i < 10; i++) {  
  45.         dispatch_sync(q, ^{  
  46.             NSLog(@"%@ - %d", [NSThread currentThread], i);  
  47.         });  
  48.     }  
  49.       
  50.     // 3. 异步任务,会在多条线程上工作,具体开多少条线程,由系统决定  
  51.     // 仍然是按照任务添加到队列中的顺序被调度,只是执行先后可能会有差异!  
  52.     // *** 能够将耗时的操作,放到子线程中工作  
  53.     // *** 与串行队列异步任务相比,并发性能更好!但是执行的先后顺序,不固定  
  54.     for (int i = 0; i < 10; i++) {  
  55.         dispatch_async(q, ^{  
  56.             NSLog(@"%@ - %d", [NSThread currentThread], i);  
  57.         });  
  58.     }  
  59. }  
  60.   
  61.   
  62. #pragma mark - 全局并行(并发)队列(使用更为普遍一些)  
  63. - (void)gcdDemo3{  
  64.     // 1. 获取全局队列(与自定义并行队列的区别就是名字显示,其他都一样)  
  65.     dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
  66.     // 使用全局队列,不需要考虑共享的问题  
  67.       
  68.     // 2. 同步任务  
  69.     for (int i = 0; i < 10; i++) {  
  70.         dispatch_sync(q, ^{  
  71.             NSLog(@"%@ - %d", [NSThread currentThread], i);  
  72.         });  
  73.     }  
  74.       
  75.     // 3. 异步任务  
  76.     for (int i = 0; i < 10; i++) {  
  77.         dispatch_async(q, ^{  
  78.             NSLog(@"%@ - %d", [NSThread currentThread], i);  
  79.         });  
  80.     }  
  81. }  
  82.   
  83.   
  84. #pragma mark - 主队列(专门调度在主线程上工作的队列,不能开线程)  
  85. - (void)gcdDemo4{  
  86.     // 1. 获取主队列  
  87.     dispatch_queue_t q = dispatch_get_main_queue();  
  88.       
  89.     // 2. 不要同步任务(死锁!!!)  
  90.     //    dispatch_sync(q, ^{  
  91.     //        NSLog(@"不会输出的!!!");  
  92.     //    });  
  93.       
  94.     // 3. 异步任务,在主线程上依次顺序执行  
  95.     for (int i = 0; i < 10; i++) {  
  96.         dispatch_async(q, ^{  
  97.             NSLog(@"%@ - %d", [NSThread currentThread], i);  
  98.         });  
  99.     }  
  100. }  

二、GCD进行线程间通讯

这里从主线程调用下载图片的方法,开启一个线程下载,然后在该线程任务完成后,返回主线程。

[objc] view plaincopy
  1. - (void)downloadImage{  
  2.     // 1. 全局并行队列  
  3.     dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
  4.       
  5.     // 2. 异步任务  
  6.     dispatch_async(queue, ^{  
  7.         NSLog(@"开始下载图片 %@", [NSThread currentThread]);  
  8.         //。。。。  
  9.         NSLog(@"完成下载图片 %@", [NSThread currentThread]);  
  10.           
  11.         // 3. 通知主队列更新UI  
  12.         // 给主队列,添加一个异步任务,更新UI  
  13.         dispatch_async(dispatch_get_main_queue(), ^{  
  14.             //可以做更新UI操作。。。。  
  15.         });  
  16.     });  
  17. }  


下面的2篇不错,可以更好的理解:
http://blog.csdn.net/onlyou930/article/details/8225906

http://www.cnblogs.com/pure/archive/2013/03/31/2977420.html


转载请注明出处:http://blog.csdn.net/xn4545945  
0 0
原创粉丝点击