码迷,mamicode.com
首页 > 编程语言 > 详细

GCD 线程处理

时间:2015-11-14 12:26:01      阅读:351      评论:0      收藏:0      [点我收藏+]

标签:

                                         GCD
一。GCD概述
二。GCD的常规使用方法
三。GCD大杀器----异步下载图片并刷新UI。
四。GCD+Block
五一次性执行:
六延迟执行
七  dispatch_time_t与秒的对应关系
一。GCD概述
Grand宏大的 Central中央 Dispatch调度
是处理多线程的,类似于NSThread,但是比NSThread强大很多
架构核心是队列和执行方法,dispatch_queue_t和dispatch_async(或dispatch_sync,同步方法一般都不使用)
二。GCD的常规使用方法
GCD的使用有三种方法:


第一种:create一个串行分线程队列
    //创建一个串行调度队列(这种方式不推荐使用,一般都是去获取而不是创建)
    //第一个执行完之后才会执行下一个,如果第一个耗时较长,那么下一个需要等待
    //第一个参数:唯一的一个标示符,是c的字符串
    //第二个参数:是对这个队列的描述  ,是(串行 /并行),可以直接写NULL
dispatch_queue_t queue = dispatch_queue_create("com.zhuoyouapp.agcd", NULL);
    //同步执行,会处于等待状态,可能会卡死主线程
    dispatch_sync(queue, ^{
        //同步执行是在主线程中进行的
        //NSLog(@"-----%d----", [NSThread isMainThread]);
        
    });
    //异步执行,立即返回,不会对主线程有影响
    dispatch_async(queue, ^{


        //NSLog(@"----2-----");
        //[NSThread sleepForTimeInterval:5];
        //NSLog(@"----3-----");
    });
    
    dispatch_async(queue, ^{
        //[NSThread sleepForTimeInterval:5];
        //串行队列的异步执行是在分线程中执行的
        //NSLog(@"----%d-----", [NSThread isMainThread]);
    });
    dispatch_async(queue, ^{
        //[NSThread sleepForTimeInterval:3];
        //NSLog(@"----2-----");
    });
    dispatch_async(queue, ^{
        //[NSThread sleepForTimeInterval:1];
        //NSLog(@"----3-----");
    });
第二种:获得一个并行分线程队列
    //第一个参数:优先级,选默认即可
    //第二个参数:标记,写0即可
    dispatch_queue_t queue2 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue2, ^{
        //[NSThread sleepForTimeInterval:1];
        //在分线程中完成,如果有大量数据需要下载,可以放在此处
        //NSLog(@"----%d-----", [NSThread isMainThread]);
    });
    dispatch_async(queue2, ^{
        //[NSThread sleepForTimeInterval:2];
        //NSLog(@"----2-----");
    });
    dispatch_async(queue2, ^{
        //[NSThread sleepForTimeInterval:3];
        //NSLog(@"----3-----");
    });
第三种:获取主线程队列
dispatch_queue_t queue3 = dispatch_get_main_queue();
    dispatch_async(queue3, ^{
        //主线程中执行,如果有刷新UI的操作,写在此处
        NSLog(@"----%d-----", [NSThread isMainThread]);
    });
    dispatch_async(queue3, ^{
        NSLog(@"----2-----");
    });
    dispatch_async(queue3, ^{
        NSLog(@"----3-----");
    });



三。GCD大杀器----异步下载图片并刷新UI。

/*****************************************重点内容*********************************************/
  //下载并刷新UI

  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        
        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://百度的图片地址]];
        
        UIImage *image = [UIImage imageWithData:data];
        

     dispatch_async(dispatch_get_main_queue(), ^{

            self.imageView.image = image;

     });
        
 });
/****************************************************************************************************/



四。GCD+Block
gcd中使用block会对没有__block修饰的局部变量,无论是基本数据类型还是对象指针还是形参,都会retain一次,执行完之后会自动release。
行完之后会释放其保留的那次引用计数
    ZYTest *test = [[ZYTest alloc] init];
    
    //NSLog(@"1--->%d", test.retainCount);
    
    dispatch_queue_t queue4 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    dispatch_async(queue4, ^{
        //NSLog(@"2--->%d", test.retainCount);
        //test.date = [NSDate date];
    });
    //[NSThread sleepForTimeInterval:1];
    //NSLog(@"3--->%d", test.retainCount);
gcd中的block会对形参对象retain一次,无论原来这个形参是什么类型的(__block,局部,全局)

    t = [[ZYTest alloc] init];
    [self test:t];
    [t release];

test方法的内容:
- (void)test:(ZYTest *)test
{
    NSLog(@"1--->%d", test.retainCount);
    dispatch_queue_t queue4 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    dispatch_async(queue4, ^{
        
        NSLog(@"2--->%d", test.retainCount);
        //test.date = [NSDate date];
    });
    [NSThread sleepForTimeInterval:1];
    NSLog(@"3--->%d", test.retainCount);
}
一次性执行:
// 一次性执行:
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// code to be executed once
});
六、延迟执行
// 延迟2秒执行:
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
// code to be executed on the main queue after delay
});

七  dispatch_time_t与秒的对应关系


dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC);


 
 

GCD 线程处理

标签:

原文地址:http://www.cnblogs.com/LkBolg/p/4964048.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!