您的位置:首页 > 移动开发 > IOS开发

IOS GCD 简介

2014-08-24 22:03 246 查看
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
plaincopy





#pragma mark - GCD(Grand Central Dispatch)  

- (void)GCD{  

  

    dispatch_queue_t queue = dispatch_queue_create("test", NULL);  

      

    // 多一个a,异步  

    dispatch_async(queue, ^{  

          

        for (int i = 0; i < 100; i++) {  

            NSLog(@"--多线程--%d",i);  

        }  

          

        // 判断是否是在多线程运行环境  

        BOOL isMulti = [NSThread isMultiThreaded];  

        NSLog(@"%d",isMulti);  

        if (isMulti) {  

            NSLog(@"*********多线程***********");  

        }  

          

        // 将代码块中的工作转回到主线程  

        dispatch_sync(dispatch_get_main_queue(), ^{  

              

            // 判断是否是在主线程运行环境  

            BOOL isMain = [NSThread isMainThread];  

            if (isMain) {  

                NSLog(@"*********主线程**********");  

            }  

              

        });  

          

    });  

      

/*    // 通过此方式,还是运行在当前线程 

    dispatch_sync(queue, ^{ 

        // 主线程 

    }); 

 */     

    for (int i = 0; i < 100; i++) {  

        NSLog(@"--主线程--%d",i);  

    }  

}  

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

[objc] view
plaincopy





#pragma mark - 给UIImageView写一个类目  

@interface UIImageView (WebCach)  

  

- (void)setImageWithURL:(NSURL *)url;  

  

@end  

  

#import "UIImageView+WebCach.h"  

  

@implementation UIImageView (WebCach)  

  

- (void)setImageWithURL:(NSURL *)url{  

  

    dispatch_queue_t queue = dispatch_queue_create("loadImage", NULL);  

  

    dispatch_async(queue, ^{  

          

        NSData * data = [NSData dataWithContentsOfURL:url];  

        UIImage * image = [UIImage imageWithData:data];  

          

        // 加载UI的操作,一般放在主线程进行  

        dispatch_async(dispatch_get_main_queue(), ^{  

              

            self.image = image;  

        });  

          

    });  

}  

  

@end  

  

- (void)viewDidLoad  

{  

    [super viewDidLoad];  

    // Do any additional setup after loading the view.  

  

    UIImageView * imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];  

    [imageView setImageWithURL:[NSURL URLWithString:@"http://www.baidu.com/img/bdlogo.gif"]];  

      

    [self.view addSubview:imageView];  

      

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  GCD