IOS GCD 简介

1.基本介绍:

(1) Grand Central Dispatch (GCD)是Apple开发的一个多核编程的较新的解决方法。在Mac OS X 10.6雪豹中首次推出,并在最近引入到了iOS4.0。

(2) GCD是一个替代诸如NSThread等技术的很高效和强大的技术。GCD完全可以处理诸如数据锁定和资源泄漏等复杂的异步编程问题。

(3) 它是IOS多线程抽象层次最高的一层,下面还有前面2章节介绍的更加轻量级的Cocoa operations,和Thread。


2.主要方法:

(1)创建一个队列   
  dispatch_queue_t queue = dispatch_queue_create("LoadImage", NULL);

       其中,第一个参数是标识队列的,第二个参数是用来定义队列的参数(目前不支持,因此传入NULL)。
(2)执行一个队列(async--->异步,sync--->同步)   
  dispatch_async(queue, ^{ [self doSomething]; });

        其中,首先传入之前创建的队列,然后提供由队列运行的代码块。
(3)声明并执行一个队列 (如果不需要保留要运行的队列的引用)
  dispatch_async(dispatch_queue_create ("LoadImage", NULL), ^{ [self doSomething]; });

(4)暂停一个队列   
  dispatch_suspend(queue);

(5)恢复一个队列(如果暂停一个队列不要忘记恢复)

       dispatch_resume(queue);

(6)将代码块中的工作转回到主线程(注意,dispatch_suspend (以及dispatch_resume)在主线程上不起作用)
  dispatch_sync(dispatch_get_main_queue(), ^{ [self dismissLoginWindow]; });


3.代码示例

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #pragma mark - GCD(Grand Central Dispatch)  
  2. - (void)GCD{  
  3.   
  4.     dispatch_queue_t queue = dispatch_queue_create("test"NULL);  
  5.       
  6.     // 多一个a,异步  
  7.     dispatch_async(queue, ^{  
  8.           
  9.         for (int i = 0; i < 100; i++) {  
  10.             NSLog(@"--多线程--%d",i);  
  11.         }  
  12.           
  13.         // 判断是否是在多线程运行环境  
  14.         BOOL isMulti = [NSThread isMultiThreaded];  
  15.         NSLog(@"%d",isMulti);  
  16.         if (isMulti) {  
  17.             NSLog(@"*********多线程***********");  
  18.         }  
  19.           
  20.         // 将代码块中的工作转回到主线程  
  21.         dispatch_sync(dispatch_get_main_queue(), ^{  
  22.               
  23.             // 判断是否是在主线程运行环境  
  24.             BOOL isMain = [NSThread isMainThread];  
  25.             if (isMain) {  
  26.                 NSLog(@"*********主线程**********");  
  27.             }  
  28.               
  29.         });  
  30.           
  31.     });  
  32.       
  33. /*    // 通过此方式,还是运行在当前线程 
  34.     dispatch_sync(queue, ^{ 
  35.         // 主线程 
  36.     }); 
  37.  */     
  38.     for (int i = 0; i < 100; i++) {  
  39.         NSLog(@"--主线程--%d",i);  
  40.     }  
  41. }  


4.加载网络图片(在多线程加载明显比放在主线程加载快N多)

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #pragma mark - 给UIImageView写一个类目  
  2. @interface UIImageView (WebCach)  
  3.   
  4. - (void)setImageWithURL:(NSURL *)url;  
  5.   
  6. @end  
  7.   
  8. #import "UIImageView+WebCach.h"  
  9.   
  10. @implementation UIImageView (WebCach)  
  11.   
  12. - (void)setImageWithURL:(NSURL *)url{  
  13.   
  14.     dispatch_queue_t queue = dispatch_queue_create("loadImage"NULL);  
  15.   
  16.     dispatch_async(queue, ^{  
  17.           
  18.         NSData * data = [NSData dataWithContentsOfURL:url];  
  19.         UIImage * image = [UIImage imageWithData:data];  
  20.           
  21.         // 加载UI的操作,一般放在主线程进行  
  22.         dispatch_async(dispatch_get_main_queue(), ^{  
  23.               
  24.             self.image = image;  
  25.         });  
  26.           
  27.     });  
  28. }  
  29.   
  30. @end  
  31.   
  32. - (void)viewDidLoad  
  33. {  
  34.     [super viewDidLoad];  
  35.     // Do any additional setup after loading the view.  
  36.   
  37.     UIImageView * imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100100100100)];  
  38.     [imageView setImageWithURL:[NSURL URLWithString:@"http://www.baidu.com/img/bdlogo.gif"]];  
  39.       
  40.     [self.view addSubview:imageView];  
  41.       
  42. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值