大家好,今天来为大家分享深入解析iOS多线程GCD:队列与任务操作指南(实例代码展示)的一些知识点,和的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
任务:同步(sync)和异步(async)的主要区别在于,当前线程是否会被阻塞,直到Block中的任务完成!
如果是同步(sync)操作,则会阻塞当前线程,等待Block中的任务完成后,当前线程才继续运行。
如果是异步(async)操作,当前线程会直接执行,不会阻塞当前线程。
好吧,不懂也没关系,我会在代码中给你解释和验证;
1、队列 (主要三个队列,为更好理解队列,队列中全部先放入异步任务)
1.主线程队列
主线程队列内部执行任务为串行同步操作
主线程队列不需要我们创建,可以通过dispatch_get_main_queue()方法获取
dispatch_queue_t 队列=dispatch_get_main_queue();
dispatch_async(队列, ^{
});
或者
dispatch_async(dispatch_get_main_queue(), ^{
});
实例:
-(void)mainQueue{
//异步任务
dispatch_async(dispatch_get_main_queue(), ^{
for (NSInteger i=0; i 10; i++) {
NSLog(@"主线程任务2_i:%ld",i);
}
});
}输出示例:
Snip20161012_2.png
总结:数据在主线程中顺序输出
2.创建串行队列
//创建用户串行队列dispatch_queue_create("com.gcd", NULL), "com.gcd" : 队列名称为C字符串。没有特殊要求。 Apple 建议使用反向标识符。表达
//串行队列内部也是串行操作
dispatch_async(dispatch_queue_create("com.gcd", NULL), ^{
//任务
});
//我们自己创建的队列需要自己销毁(非arc需要销毁)
//dispatch_release(队列);
实例:
-(void)tandemPrivateQueue{
//自定义私有串行队列
dispatch_queue_t 队列=dispatch_queue_create("com.privateQueue", NULL);
//异步任务1加入队列
dispatch_async(队列, ^{
NSLog(@"私有队列任务1");
for (NSInteger i=0; i 10; i++) {
NSLog(@"私有队列任务1_i:%ld",i);
}
});
//异步任务2加入队列
dispatch_async(队列, ^{
NSLog(@"私有队列任务2");
for (NSInteger i=0; i 10; i++) {
NSLog(@"私有队列任务2_i:%ld",i);
}
});
}输出示例:
Snip20161012_3.png 摘要:私有队列中的任务是串行的。如输出所示:先执行任务1,然后执行任务2。
3.全局队列 并行队列
/*
//并行队列(全局)不需要我们创建,可以通过dispatch_get_global_queue()方法获取
//三个可用队列
//第一个参数是选择一个全局队列,一般为DEFAULT,默认优先级队列。
//第二个参数是保留标志。当前版本没有用(不代表未来版本)。只需将其设置为0 即可。
//DISPATCH_QUEUE_PRIORITY_HIGH
//DISPATCH_QUEUE_PRIORITY_DEFAULT
//DISPATCH_QUEUE_PRIORITY_LOW
*/
dispatch_queue_t 队列=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
实例:
-(void)parallelGlobalQueue{
//全局并行队列
dispatch_queue_t globalQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(globalQueue, ^{
NSLog(@"全局队列任务1");
for (NSInteger i=0; i 10; i++) {
NSLog(@"全局队列任务1_i:%ld",i);
[NSThread sleepForTimeInterval:0.5];
}
});
dispatch_async(globalQueue, ^{
NSLog(@"全局队列任务2");
for (NSInteger i=0; i 10; i++) {
NSLog(@"全局队列任务2_i:%ld",i);
[NSThread sleepForTimeInterval:0.5];
}
});
}输入示例:
Snip20161012_4.png 摘要:全局队列中的任务是异步同时执行的:任务1和2同时执行
此时你应该对队列有一个大概的了解了。接下来我们就来完成任务吧。
2、任务
//同步任务:
调度_同步(, ^{
//这里代码
NSLog(@"%@", [NSThread 当前线程]);
});//异步任务:
调度_异步(, ^{
//这里代码
NSLog(@"%@", [NSThread 当前线程]);
});同步任务和异步任务的区别
在上面的队列解释中,队列中的所有任务都是异步任务。接下来,我们将globalQueue队列中的两个异步任务1和2改为同步任务。如果我们修改如下会发生什么?
-(void)并行全局队列{
//并行全局队列
dispatch_queue_t globalQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//添加同步任务1
dispatch_sync(globalQueue, ^{
NSLog(@"全局队列任务1");
for (NSInteger i=0; i 10; i++) {
NSLog(@"全局队列任务1_i:%ld",i);
}
});
//添加同步任务2
dispatch_sync(globalQueue, ^{
NSLog(@"全局队列任务2");
for (NSInteger i=0; i 10; i++) {
NSLog(@"全局队列任务2_i:%ld",i);
}
});
} 输出:
Snip20161012_6.png小结:为什么并行globalQueue队列中同步任务和异步任务的输出对不同?
原因:1和2是同步任务。虽然两个任务在并行队列中同时执行,但由于同步的原因,任务1会先执行完block中的所有代码,然后再继续执行后面的代码。任务2也是如此。即任务1出现并在任务2输出之前输出0-9。
在此,你明白了异步和同步的区别了吗?如果是同步(sync)操作,则会阻塞当前线程,等待Block中的任务完成后,当前线程才继续运行。
如果是异步(async)操作,当前线程会直接执行,不会阻塞当前线程。
关于异步和同步对UI的影响
我们不妨在Main.storyboard中打一个标签,看看启动效果。
Snip20161012_11.png 同步任务在串/并队列中的任务1和任务2完成输出后,会显示UIlabel“启动页面”;
异步任务会先显示在串行/并行队列中,执行完任务1和任务2后会输出0-9;
可见同步会阻碍主线程的进度,而异步则不会。因此,很多耗时操作完成后,异步任务完成,然后返回主线程刷新UI。
至于队列对UI的影响
这样说吧,队列只是加载任务,管理任务的顺序。无论是同时来,还是一一来,是否有影响,由队列中的任务决定;但也有特殊情况。
-(void)tandemPrivateQueue{
//自定义私有串行队列
dispatch_queue_t 队列=dispatch_queue_create("com.privateQueue", NULL);
//异步任务1加入私有队列
dispatch_async(队列, ^{
NSLog(@"私有队列任务1");
for (NSInteger i=0; i 10; i++) {
NSLog(@"私有队列任务1_i:%ld",i);
}
});
//同步任务2加入私有队列
调度_同步(队列,^{
NSLog(@"私有队列任务2");
for (NSInteger i=0; i 10; i++) {
NSLog(@"私有队列任务2_i:%ld",i);
}
});
}虽然任务1是异步的,但并不影响‘起始页’的出现,但如果任务2是同步的,则要等到同步任务2的输出完成后,‘起始页’才会出现;
这种现象在并行队列中也是如此。
因此,无论是串行队列还是并行队列,只要出现同步任务,就会先执行block中的代码,然后再继续。
好了,文章到此结束,希望可以帮助到大家。
【深入解析iOS多线程GCD:队列与任务操作指南(实例代码展示)】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
终于看到一篇好用的iOS多线程教程,一直在想怎么深入学习这块知識
有9位网友表示赞同!
队列和任务?听起来很专业的样子,希望能简单易懂地讲解!
有6位网友表示赞同!
实例代码验证能直接看效果真是太棒了,理论知识加 实践经验更吸金
有17位网友表示赞同!
我刚开始学iOS开发,多线程这块一直不太理解,希望能通过这篇帖子有所突破
有5位网友表示赞同!
GCD这么常用的工具总感觉还是没有太深入了解过,这次好好来学习一下吧!
有5位网友表示赞同!
希望这个帖子能给我一个清晰的框架,让我对 iOS 多线程GCD有更全面认识
有16位网友表示赞同!
多线程开发是iOS开发者必备的技能,这篇博客看起来很有帮助.
有7位网友表示赞同!
实例代码验证真是太酷了!可以直接对比效果,学习起来感觉更有动力
有18位网友表示赞同!
我已经了解了GCD的基本概念,但队列和任务的使用方法我还不清楚,期待这个详细讲解
有19位网友表示赞同!
我一直想找一篇讲解队列和任务的文章,终于找到这个宝藏帖子啦!
有6位网友表示赞同!
iOS开发越来越难了,多线程这块更是让人头疼。希望这篇博客能给我带来一些启发
有6位网友表示赞同!
多线程知识点很多,这篇博客或许能帮我梳理一下思路。
有16位网友表示赞同!
学习新框架总是很费劲,希望能通过这个详细的教程尽快掌握GCD的多线程应用!
有11位网友表示赞同!
多线程开发效率可是很高啊,但怎么才能用好呢?期待这篇文章给我答案!
有14位网友表示赞同!
现在许多iOS项目都要求使用多线程,希望这篇博客能让我提升开发能力!
有9位网友表示赞同!
我想要学习更高级的iOS开发知识,多线程GCD似乎是一个很好的突破口!
有5位网友表示赞同!
代码实例是学编程最直观的方式,期待这个文章能够帮助我更好地理解多线程概念。
有15位网友表示赞同!
终于看到一篇关于 iOS 多线程的详细讲解,太开心啦!
有8位网友表示赞同!
希望这篇文章能够把我困扰已久的 multithread 知识点给彻底解决!
有15位网友表示赞同!