///创建全局队列
///们可以在block里运行各种耗时的操作(如网络请求) 而同时不会阻塞UI线程。
///dispatch_get_global_queue 会获取一个全局队列,我们姑且理解为系统为
///我们开启的一些全局线程。我们用priority指定队列的优先级,而flag作
///为保留字段备用(一般为0) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (int i = 0; i < 2; ++i) {
NSLog(@"1------%@",[NSThread currentThread]);
}
// 回到主线程 一般执行更新界面的操作
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"2-------%@",[NSThread currentThread]);
});
});
//创建串行队列 第一个参数表示队列的唯一标示符,用于debug。可为空。 第二个参数表明是串行队列 还是并行队列
dispatch_queue_t queue1 = dispatch_queue_create("test.evecom.syc", DISPATCH_QUEUE_SERIAL);
//创建并发队列
dispatch_queue_t queue2 = dispatch_queue_create("test.evecom.asyc", DISPATCH_QUEUE_CONCURRENT);
//获取主队列
dispatch_queue_t queue3 = dispatch_get_main_queue();
同步和异步决定了要不要开启新的线程
同步:在当前线程中执行任务,不具备开启新线程的能力
异步:在新的线程中执行任务,具备开启新线程的能力
并发和串行决定了任务的执行方式
并发:多个任务并发(同时)执行
串行:一个任务执行完毕后,再执行下一个任务
///同步串行
dispatch_sync(queue1, ^{
//// 同步执行任务代码
});
//异步并发
dispatch_async(queue2, ^{
//// 异步执行任务代码
});
NSLog(@"currentThread --- %@",[NSThread currentThread]); ///打印出当前线程
NSLog(@"syncConcurrent--- Start");
dispatch_queue_t queue2 = dispatch_queue_create("test.evecom.asyc", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue2, ^{
for (int i = 0; i < 4; ++i) {
[NSThread sleepForTimeInterval:2]; // 模拟耗时操作
NSLog(@"1---%@",[NSThread currentThread]); // 打印当前线程
}
});
dispatch_async(queue2, ^{
// 追加任务2
for (int i = 0; i < 2; ++i) {
[NSThread sleepForTimeInterval:2]; // 模拟耗时操作
NSLog(@"2---%@",[NSThread currentThread]); // 打印当前线程
}
});
dispatch_async(queue2, ^{
// 追加任务2
for (int i = 0; i < 2; ++i) {
[NSThread sleepForTimeInterval:2]; // 模拟耗时操作
NSLog(@"3 ---%@",[NSThread currentThread]); // 打印当前线程
}
});
/**
所有任务是在打印的syncConcurrent---begin和syncConcurrent---end之后才执行的。说明当前线程没有等待,而是直接开启了新线程,在新线程中执行任务(异步执行不做等待,可以继续执行任务)
**/
NSLog(@"syncConcurrent---end");
// GCD 栅栏方法:dispatch_barrier_async
// 我们有时需要异步执行两组操作,而且第一组操作执行完之后,才能开始执行第二组操作。
dispatch_queue_t queue = dispatch_queue_create("net.evecom.iOSQ", DISPATCH_QUEUE_CONCURRENT); //创建并行队列
dispatch_async(queue, ^{
// 追加任务1
for (int i = 0; i < 2; ++i) {
[NSThread sleepForTimeInterval:2]; // 模拟耗时操作
NSLog(@"1 %d---%@",i,[NSThread currentThread]); // 打印当前线程
}
});
dispatch_async(queue, ^{
// 追加任务2
for (int i = 0; i < 2; ++i) {
[NSThread sleepForTimeInterval:2]; // 模拟耗时操作
NSLog(@"2 %d---%@",i,[NSThread currentThread]); // 打印当前线程
}
});
///追加栅栏任务
dispatch_barrier_async(queue, ^{
// 追加任务 barrier
for (int i = 0; i < 2; ++i) {
[NSThread sleepForTimeInterval:2]; // 模拟耗时操作
NSLog(@"barrier---%@",[NSThread currentThread]);// 打印当前线程
}
});
dispatch_async(queue, ^{
// 追加任务3
for (int i = 0; i < 2; ++i) {
[NSThread sleepForTimeInterval:2]; // 模拟耗时操作
NSLog(@"3---%@",[NSThread currentThread]); // 打印当前线程
}
});
dispatch_async(queue, ^{
// 追加任务4
for (int i = 0; i < 2; ++i) {
[NSThread sleepForTimeInterval:2]; // 模拟耗时操作
NSLog(@"4---%@",[NSThread currentThread]); // 打印当前线程
}
});
///在dispatch_barrier_async执行结果中可以看出:
// 在执行完栅栏前面的操作之后,才执行栅栏操作,最后再执行栅栏后边的操作
/** GCD 队列组 dispatch_group */
-(void)dispatchGroup{
// 有时候我们会有这样的需求:分别异步执行2个耗时任务,然后当2个耗时任务都执行完毕后再回到主线程执行任务。这时候我们可以用到 GCD 的队列组
NSLog(@"currentThread%@", [NSThread currentThread]);
NSLog(@"group---begin");
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, ^{
// 追加任务1
for (int i = 0; i < 2; ++i) {
[NSThread sleepForTimeInterval:2]; // 模拟耗时操作
NSLog(@"1---%@",[NSThread currentThread]); // 打印当前线程
}
});
dispatch_group_async(group, queue, ^{
// 追加任务2
for (int i = 0; i < 2; ++i) {
[NSThread sleepForTimeInterval:2]; // 模拟耗时操作
NSLog(@"2---%@",[NSThread currentThread]); // 打印当前线程
}
});
// 当所有任务都执行完成之后,才执行dispatch_group_notify block 中的任务。
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// 等前面的异步任务1、任务2都执行完毕后,回到主线程执行下边任务
for (int i = 0; i < 2; ++i) {
[NSThread sleepForTimeInterval:2]; // 模拟耗时操作
NSLog(@"3---%@",[NSThread currentThread]); // 打印当前线程
}
NSLog(@"group---end");
});
NSLog(@"group---end2");
}
//暂停当前线程(阻塞当前线程),等待指定的 group 中的任务执行完成后,才会往下继续执行
-(void)groupWait{
NSLog(@"%@",[NSThread currentThread]);
NSLog(@"group --- begin");
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, ^{
// 追加任务1
for (int i = 0; i < 2; ++i) {
[NSThread sleepForTimeInterval:2]; // 模拟耗时操作
NSLog(@"1---%@",[NSThread currentThread]); // 打印当前线程
}
});
dispatch_group_async(group, queue, ^{
// 追加任务1
for (int i = 0; i < 2; ++i) {
[NSThread sleepForTimeInterval:2]; // 模拟耗时操作
NSLog(@"2---%@",[NSThread currentThread]); // 打印当前线程
}
});
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
// 等待上面的任务全部完成后,会往下继续执行(会阻塞当前线程)
NSLog(@"group --- end");
}
网友评论