GCD 概述、使用大杀器

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);

posted @ 2015-11-12 16:30  偶家大人  阅读(168)  评论(0编辑  收藏  举报