GCD的基本使用

1,简单的写法

//dispatch_get_global_queue(0, 0)是全局并发队列,后面括号内是要执行的任务
dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"task %@",[NSThread currentThread]);
    });
//输出后可以看见,线程的复用,能够避免线程重复的创建和销毁,节省时间和空间;不用我们管理线程的生命周期
for (int i = 0; i < 20; i++) {
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
             NSLog(@"task %@ %d",[NSThread currentThread],i);
        });
    }

2,知识点
并发队列:(1)可以让多个任务同时执行,自动开启多个线程;(2)只有在异步函数下才有效;
串行队列:让任务一个接着一个执行
主队列:特殊的串行队列,代表主线程

同步操作:在当前线程中执行任务,不具备开启新线程的能力;
异步操作:在新的线程中执行任务,具备开启新线程的能力;

3,串行队列的操作
(1)串行队列的同步操作

//不开线程,在当前线程下执行
//任务是有序执行的
-(void)demo{
//创建串行队列
    //参数1:队列的名字
    //参数2:队列的属性
    dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);
    
    for (int i =0; i<20; i++) {
        dispatch_sync(serialQueue, ^{
            NSLog(@"serialQueue %@ %d",[NSThread currentThread],i);
        });
    }
}

(2)串行队列的异步操作

//开一个线程
//任务是有序执行的
-(void)demo{
    //创建串行队列
    //参数1:队列的名字
    //参数2:队列的属性
    dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);
    
    for (int i =0; i<20; i++) {
        dispatch_async(serialQueue, ^{
            NSLog(@"serialQueue %@ %d",[NSThread currentThread],i);
        });
    }
}

4,并行队列的操作
(1)并行队列,异步执行

//开多个线程
//任务无序执行
//效率最大
-(void)demo1{
    //生成并行队列
    dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
    
    for (int i = 0; i < 20; i++) {
        dispatch_async(concurrentQueue, ^{
            NSLog(@"con %@ %d",[NSThread currentThread],i);
        });
    }
}

(2)并行队列同步操作

//不开线程,在当前线程下执行
//任务顺序执行
//等于串行队列,同步执行
-(void)demo{
    //生成并行队列
    dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
    
    for (int i = 0; i < 20; i++) {
        dispatch_sync(concurrentQueue, ^{
            NSLog(@"con %@ %d",[NSThread currentThread],i);
        });
    }
}

总结:开不开线程是由:同步操作(不开启线程)和异步操作(开启线程)
4,主队列的操作
主队列之能够在异步执行,任务顺序执行;
不能够在同步执行,会造成死锁;

你可能感兴趣的:(GCD的基本使用)