CGD:
理解下同步和异步:
1、同步 - 主线程执行
//同步-调用主线程执行
NSLog(@"---之前---");
dispatch_sync(dispatch_get_main_queue(), ^{//同步执行,到这里时会主线程被阻塞,等待block里面代码执行完
NSLog(@"---同步执行---");//把任务放到主线程执行,因为此时主线程是被阻塞的,所以不会执行
});
NSLog(@"---之后---");
输出结果:
同步 - 主线程执行.png
2、异步 - 主线程执行
//异步-调用主线程执行
NSLog(@"---之前---");
dispatch_async(dispatch_get_main_queue(), ^{//异步执行,到这里时对开辟一个线程来执行block里面代码
NSLog(@"---同步执行---");//放到异步线程执行
});
NSLog(@"---之后---");//直接执行,不等待block里面代码执行完
输出结果:
异步 - 主线程执行.png3、串行队列
//创建串行队列
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
NSLog(@"第一");
dispatch_async(queue, ^{//异步,多开一条线程执行
NSLog(@"第二");//正常输出
dispatch_sync(queue, ^{//同步,使用创建的串行队列,此时阻塞等待block运行完
NSLog(@"第三");//使用queue执行,queue一次执行一个任务,但是已经阻塞,卡在这边
});
NSLog(@"第四");
});
NSLog(@"第五");//跳过以上异步线程,继续执行这里
输出结果:
Paste_Image.png3、队列组
队列组就是把多个队列加到一个组里,这样做的好处是,当队列组里面的队列全部执行完后,队列组会通过一个方法通知我们,此时我们就知道队列执行完了,然后写此时要做的事
//-----------------队列组------------------
//创建队列组
dispatch_group_t group = dispatch_group_create();
//创建队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//多次使用队列组的方法执行任务,均使用异步方法
//执行3此循环
dispatch_group_async(group, queue, ^{
for (int i = 0 ; i < 3; i++)
{
NSLog(@"%d",i);
}
});
//主队列执行5次循环
dispatch_group_async(group, dispatch_get_main_queue(), ^{
for (int i = 0 ; i < 5; i++)
{
NSLog(@"主队列:%d",i);
}
});
//group队列组执行完毕后
dispatch_group_notify(group, queue, ^{
NSLog(@"group执行完毕!!!!");
});
输出结果:
队列组.png
网友评论