线程GCD

GCD主要由队列和任务两部分来实现.
1.队列主要包含三种:主线程队列、并行队列、串行队列
2.任务主要包含两种:异步任务和同步任务
多线程执行过程就是把任务放在队列中去执行的过程

队列:
自己分析:队列是对于多任务而言,根据需求,如果是多个任务同时执行就采用全局并行队列.如果是多个任务依次执行,就采用串行队列.
并行队列 :在队列中的多个任务(线程) 同时执行 (不按顺序执行)
串行队列: 在队列中的多个任务(线程)排队 依次执行(按顺序执行)

同步/异步:
自己分析:同步与异步是对于线程而言,如果是异步那么就开辟新的线程执行任务,同步就在当前线程执行.
同步(sync) 和 异步(async) 的主要区别在于会不会阻塞当前线程,直到 Block 中的任务执行完毕!
如果是 同步(sync) 操作,它会阻塞当前线程并等待 Block 中的任务执行完毕,然后当前线程才会继续往下运行。
如果是 异步(async)操作,当前线程会直接往下执行,它不会阻塞当前线程。

队列 (这里队列全部先放入异步任务)

主线程队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
    dispatch_async(mainQueue, ^{

    });
串行队列
 // 创建一个用户串行队列:"com.li":队列名是一个C字符串,没有特别的要求,Apple建议用倒装的标识符来表示
    dispatch_queue_t serialQueue = dispatch_queue_create("com.li", NULL);
    dispatch_async(serialQueue, ^{

    });
 //自己创建的队列,mrc情况下需要自己销毁
 //dispatch_release(serialQueue);

全局并行队列

   // 第一个参数是选取按个全局队列,一般采用DEFAULT,默认优先级队列
   // 第二个参数是保留标志,目前的版本没有任何用处(不代表以后版本),直接设置为0就可以了
    // DISPATCH_QUEUE_PRIORITY_HIGH
    //DISPATCH_QUEUE_PRIORITY_DEFAULT
    // DISPATCH_QUEUE_PRIORITY_LOW
    dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
    dispatch_async(globalQueue, ^{

    });

举个例子

让AB执行完以后在执行C,C的执行条件是需要AB的结果

// 线程 队列
    dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    dispatch_group_async(group, queue, ^{
        [self testA];
    });
    
    dispatch_group_async(group, queue, ^{
        [self testB];
    });
    
    dispatch_group_notify(group, queue, ^{
        [self testC];
        
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"回主线程,干点有意义的事");
        });
    });

ABC里面的方法

-(void)testA{
    for (NSInteger i = 0; i < 10; i++) {
        NSLog(@"TestA 执行任务 - %ld", i);
    }
}
-(void)testB{
    
    for (NSInteger i = 0; i < 8; i++) {
        NSLog(@"TestB 执行任务 - %ld", i);
    }
}
-(void)testC{
    NSLog(@"执行C");
}

你可能感兴趣的:(线程GCD)