GCD的理解
2016-05-12 17:19
323 查看
1.这篇介绍比较基础,简单明了
http://www.cnblogs.com/wendingding/p/3806821.html
2.这篇文章研究了GCD,着重讲了GCD的坑
http://www.cocoachina.com/ios/20150505/11751.html
同步的方式执行任务 dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
异步的方式执行任务 dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
延迟执行任务
第一个参数一般是DISPATCH_TIME_NOW,表示从现在开始。
那么第二个参数就是真正的延时的具体时间。
NSEC_PER_SEC,每秒有多少纳秒。
USEC_PER_SEC,每秒有多少毫秒。(注意是指在纳秒的基础上)
NSEC_PER_USEC,每毫秒有多少纳秒。
例子:
“同步”的dispatch_apply
dispatch_apply的作用是在一个队列(串行或并行)上“运行”多次block,其实就是简化了用循环去向队列依次添加block任务。
dispatch_apply 会“等待”其所有的循环运行完毕才往下执行;嵌套使用容易导致死锁
//异步添加任务
//异步结束任务
dispatch_group_leave(group);
//----------------------------
同步和异步决定了要不要开启新的线程
同步:在当前线程中执行任务,不具备开启新线程的能力
异步:在新的线程中执行任务,具备开启新线程的能力
并发和串行决定了任务的执行方式
并发:多个任务并发(同时)执行
串行:一个任务执行完毕后,再执行下一个任务
使用dispatch_queue_create函数创建串行队列dispatch_queue_t dispatch_queue_create(const char *label, dispatch_queue_attr_t attr);//
主队列是GCD自带的一种特殊的串行队列,放在主队列中的任务,都会放到主线程中执行
使用dispatch_get_main_queue()获得主队列
使用dispatch_get_global_queue函数获得全局的并发队列
dispatch_queue_t dispatch_get_global_queue(dispatch_queue_priority_t priority,unsigned long flags);
说明:全局并发队列的优先级
#define DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默认(中)
#define DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 后台
一些说明
dispatch_once_t只有一份实例。
+(SchoolManager *)sharedInstance
{
static SchoolManager *sharedManager;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedManager = [[SchoolManager alloc] init];
});
return sharedManager;
}
http://www.cnblogs.com/wendingding/p/3806821.html
2.这篇文章研究了GCD,着重讲了GCD的坑
http://www.cocoachina.com/ios/20150505/11751.html
同步的方式执行任务 dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
异步的方式执行任务 dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
延迟执行任务
dispatch_after(queue);
第一个参数一般是DISPATCH_TIME_NOW,表示从现在开始。
那么第二个参数就是真正的延时的具体时间。
NSEC_PER_SEC,每秒有多少纳秒。
USEC_PER_SEC,每秒有多少毫秒。(注意是指在纳秒的基础上)
NSEC_PER_USEC,每毫秒有多少纳秒。
例子:
//挂起队列
dispatch_suspend(queue);
“同步”的dispatch_apply
dispatch_apply的作用是在一个队列(串行或并行)上“运行”多次block,其实就是简化了用循环去向队列依次添加block任务。
dispatch_apply 会“等待”其所有的循环运行完毕才往下执行;嵌套使用容易导致死锁
//异步添加任务
dispatch_group_enter(group);
//异步结束任务
dispatch_group_leave(group);
//----------------------------
同步和异步决定了要不要开启新的线程
同步:在当前线程中执行任务,不具备开启新线程的能力
异步:在新的线程中执行任务,具备开启新线程的能力
并发和串行决定了任务的执行方式
并发:多个任务并发(同时)执行
串行:一个任务执行完毕后,再执行下一个任务
使用dispatch_queue_create函数创建串行队列dispatch_queue_t dispatch_queue_create(const char *label, dispatch_queue_attr_t attr);//
串行队列DISPATCH_QUEUE_SERIAL
并行队列
DISPATCH_QUEUE_CONCURRENT
主队列是GCD自带的一种特殊的串行队列,放在主队列中的任务,都会放到主线程中执行
使用dispatch_get_main_queue()获得主队列
使用dispatch_get_global_queue函数获得全局的并发队列
dispatch_queue_t dispatch_get_global_queue(dispatch_queue_priority_t priority,unsigned long flags);
说明:全局并发队列的优先级
#define DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默认(中)
#define DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 后台
一些说明
dispatch_once_t只有一份实例。
+(SchoolManager *)sharedInstance
{
static SchoolManager *sharedManager;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedManager = [[SchoolManager alloc] init];
});
return sharedManager;
}
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 讲解iOS开发中基本的定位功能实现
- iOS中定位当前位置坐标及转换为火星坐标的方法
- js判断客户端是iOS还是Android等移动终端的方法
- iOS应用中UISearchDisplayController搜索效果的用法
- IOS开发环境windows化攻略
- iOS应用中UITableView左滑自定义选项及批量删除的实现
- 浅析iOS应用开发中线程间的通信与线程安全问题
- 检测iOS设备是否越狱的方法
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- iOS推送的那些事
- IOS 改变键盘颜色代码