标签:
重点:1."串行队列"? "并发队列"? 2.block?
{
1.GCD(Grand Central Dispatch) ---- ‘牛逼的中枢调度器‘!
// C语言框架 / 自动管理线程的生命周期(创建/释放)
推出GCD的目的:取代NSThread!
为"多核"的"并行"运算提出的解决方案!
优点:
<1> GCD 能够自动利用更多的CPU的核数(双核/四核)!
<2> GCD 会自动管理线程的生命周期.
2.GCD中的两个核心概念:
"任务":
想要做的事情/执行什么操作.
GCD 中的任务定义在block中.
void (^myBlock)() = ^{
// 想要做的事情/任务
}
"队列":
用来‘存放‘任务!
队列 != 线程!
队列中存放的任务最后都要由线程来执行!
队列的原则:先进先出,后进后出(FIFO/ First In First Out)!
队列的类型:
<1> ‘串行‘队列:(Serial Dispatch Queue)
存放按顺序执行的任务!(一个任务执行完毕,再执行下一个任务)!
// 创建一个串行队列
dispatch_queue_t serialQueue = dispatch_queue_create("serial", DISPATCH_QUEUE_SERIAL);
<2> ‘并发‘队列:(Concurrent Dispatch Queue)
存放想要同时(并发)执行的任务!
// 创建一个并发队列
dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrent",DISPATCH_QUEUE_CONCURRENT);
注意两个非常常用的特殊队列:
<1> 主队列: // UI 操作放在主队列中执行!
跟主线程相关联的队列!
主队列是 GCD 自带的一种特殊的串行队列!
主队列中的任务都会在主线程中执行!
//获取主队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
<2> 全局并发队列: // 一般情况下,并发任务都可以放在全局并发队列中!
//获取全局并发队列
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
}
重点:1."同步"函数!"异步"函数! 2.容易混淆的四个概念: ‘串行‘ ,‘并发‘ ,"同步" ,"异步"之间的区别?
{
问题:串行队列中的任务必定按顺序执行吗?并发队列中的任务必定同时执行吗?
GCD中有两个用来执行任务的函数:
‘同步‘执行任务:
dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)
‘异步‘执行任务:
dispatch_async(dispatch_queue_t queue, <#^(void)block#>)
// <#dispatch_queue_t queue#> :队列
// <#^(void)block#>:任务
"同步"和"异步"的区别:
"同步": 只能在‘当前‘线程中执行任务,不具备开启新线程的能力.
"异步": 可以在‘新‘的线程中执行任务,具备开启新线程的能力.
GCD 使用有两个步骤:
<1> 将任务添加到队列中;
<2> 选择同步还是异步的方式执行任务.
注意:四个容易混淆的术语:
‘串行‘ ,‘并发‘ ,"同步" ,"异步".
}
重点:1.两个常用的组合!
{
常见的组合
1> dispatch_async + 全局并发队列 (可以开启多条线程)
2> dispatch_async + 自己创建的串行队列 (开启一条线程)
只有‘异步‘执行"并发"队列,才可以开启多条线程.
注意:
在主线程中同步执行主队列中的任务,会造成‘主线程‘和‘主队列‘相互等待,卡住主线程!
}
重点:1.从子线程回到主线程! 2.两个注意点.
{
1.(子线程下载(耗时操作),主线程刷新UI):
dispatch_async(dispatch_get_global_queue(0, 0), ^{
// 执行耗时的异步操作...
dispatch_async(dispatch_get_main_queue(), ^{
// 回到主线程,执行UI刷新操作
});
});
2.注意:
<1> 需要设置按钮的image,建议先把按钮类型改为custom,才能保证设置成功
<2> 属性名不能以new开头
}
重点:1.iOS常见的两种延时执行方式
{
iOS中的延时执行方式:
// 定制好延时任务后,不会阻塞当前线程.
<1> 调用 NSObject 方法:
[self performSelector:@selector(run) withObject:nil afterDelay:2.0];
// 2秒后再调用self的run方法
<2> GCD 函数实现延时执行:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// 2秒后执行这里的代码... 在哪个线程执行,跟队列类型有关
});
不要使用sleep,会阻塞当前线程.
}
重点:1.了解队列组的使用方法.
{
首先:分别异步执行两个耗时操作;
其次:等两次耗时操作都执行完毕后,再回到主线程执行操作.
使用队列组(dispatch_group_t)快速,高效的实现上述需求.
dispatch_group_t group = dispatch_group_create(); // 队列组
dispatch_queue_t queue = dispatch_get_global_queue(0, 0); // 全局并发队列
dispatch_group_async(group, queue, ^{ // 异步执行操作1
// longTime1
});
dispatch_group_async(group, queue, ^{ // 异步执行操作2
// longTime2
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{ // 在主线程刷新数据
// reload Data
});
}
标签:
原文地址:http://www.cnblogs.com/liyang1991/p/4782629.html