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

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

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

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

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

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

[objc]  view plain  copy
  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方法

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  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  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值