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