iOS 多线程之GCD使用
2015-10-16 11:45
357 查看
GCD全称:Grand
Central Dispatch,是Apple开发的一套底层多核编程的API,它主要用于优化应用程序以支持多核处理器,它是一个在线程池模式的基础上执行的并行任务。GCD可以让我们不用直接和线程打交道,而是通过把任务分配给dispatch
queues(调度队列),然后让这些queues去执行task(任务)
一、定义队列
1.串行队列:dispatch_get_main_queue()
例:dispatch_queue_t mainQueue = dispatch_get_main_queue();
//串行 queue 每次只能执行一个任务,可以使用它来代替锁,保护共享资源或可变的数据结构,串行queue确保任务按可预测的顺序执行(这是比锁好的地方)
//多用于处理UI
2.并行队列:dispatch_get_global_queue(优先级,扩展)
/*
参数1:优先级 High、Default、Low、Background。
参数2:预保留参数,暂时不明其作用。写“0”
*/
例:dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//并行队列,任务同时执行,多用于处理数据
3.用户队列(自定义队列):dispatch_queue_create(队列标签, 串行/并行)
/*
参数1:标签(标识符)要保证其为全局唯一,Apple官方就推荐使用反DNS的格式来命名,这纯是为了debug,这些名字会在崩溃日志中被显示出来,也可以被调试器调用,这在调试中会很有用
参数2:(DISPATCH_QUEUE_CONCURRENT)并行/(DISPATCH_QUEUE_SERIAL)串行
*/
例:dispatch_queue_tmyQueue
= dispatch_queue_create("com.test.myQueueTag",DISPATCH_QUEUE_CONCURRENT);
//使用DISPATCH_QUEUE_CONCURRENT 就相当于是dispatch_get_global_queue 串行也同理
4.成组队列:dispatch_group_t group
= dispatch_group_create();
用法:多用于并行队列,多任务时
//在dispatch_queue中当所有的任务执行完成后想做其他操作
//在串行队列中(一般不需要用到group),可以把该操作放到最后一个任务执行完成后继续
//并行队列中,就用group的notify, dispatch_notify()是group结束的点
示例代码:
{
dispatch_group_async(group,globalQueue, ^{
[selfdosomething:@"A"];
});
dispatch_group_async(group,globalQueue, ^{
[selfdosomething:@"B"];
});
dispatch_group_notify(group,globalQueue, ^{
[selfdosomething:@"我最后执行"];
});
dispatch_group_async(group, globalQueue, ^{
[self dosomething:@"C"];
});
}//A,B,C并行执行,最后再执行notify
二、异步调度和同步调度(提交任务)
1.异步调度
dispatch_async : dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)
//把一个任务添加到某queue后就马上离开,而不管任务在那个queue里的执行状态(立即执行)
示例代码:
模板:
dispatch_async(globalQueue, ^{
//请求数据(分线程)
dispatch_async(mainQueue, ^{
//UI操作(主线程)
});
});
2.同步调度 dispatch_sync : dispatch_sync(<#dispatch_queue_t
queue#>, <#^(void)block#>)
//把一个任务添加到某queue后,等这个任务完成,调用线程才继续执行.(等前面的任务执行完)
三、GCD的更多用法
1.dispatch_once(整个工程只调用一次(可用于单例))
例:
{
staticdispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"只调用一次");
});
}
2.dispatch_apply(重复调用,调用多次)
dispatch_apply(<#size_t iterations#>, <#dispatch_queue_t queue#>, <#^(size_t)block#>)
例:
3.dispatch_after(延迟操作)
例:
dispatch_after(<#dispatch_time_t when#>, <#dispatch_queue_t queue#>, <#^(void)block#>)
{
doubledelayInSeconds =2.0;
dispatch_time_t popTime =dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
NSLog(@"2秒后执行");
});
}
4.dispatch_barrier_async(并行队列中,可充当分割线)
例:
{
dispatch_queue_t myQueue =dispatch_queue_create("myQueue",DISPATCH_QUEUE_CONCURRENT);
dispatch_async(myQueue, ^{
[selfdosomething:@"A"];
});
dispatch_async(myQueue, ^{
[selfdosomething:@"B"];
});
//分割
dispatch_barrier_async(myQueue, ^{
[selfdosomething:@"C"];
});
dispatch_async(myQueue, ^{
[selfdosomething:@"D"];
});
dispatch_async(myQueue, ^{
[selfdosomething:@"E"];
});
}
//A,B并行执行 然后执行C,再并行执行D,E
Central Dispatch,是Apple开发的一套底层多核编程的API,它主要用于优化应用程序以支持多核处理器,它是一个在线程池模式的基础上执行的并行任务。GCD可以让我们不用直接和线程打交道,而是通过把任务分配给dispatch
queues(调度队列),然后让这些queues去执行task(任务)
一、定义队列
1.串行队列:dispatch_get_main_queue()
例:dispatch_queue_t mainQueue = dispatch_get_main_queue();
//串行 queue 每次只能执行一个任务,可以使用它来代替锁,保护共享资源或可变的数据结构,串行queue确保任务按可预测的顺序执行(这是比锁好的地方)
//多用于处理UI
2.并行队列:dispatch_get_global_queue(优先级,扩展)
/*
参数1:优先级 High、Default、Low、Background。
参数2:预保留参数,暂时不明其作用。写“0”
*/
例:dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//并行队列,任务同时执行,多用于处理数据
3.用户队列(自定义队列):dispatch_queue_create(队列标签, 串行/并行)
/*
参数1:标签(标识符)要保证其为全局唯一,Apple官方就推荐使用反DNS的格式来命名,这纯是为了debug,这些名字会在崩溃日志中被显示出来,也可以被调试器调用,这在调试中会很有用
参数2:(DISPATCH_QUEUE_CONCURRENT)并行/(DISPATCH_QUEUE_SERIAL)串行
*/
例:dispatch_queue_tmyQueue
= dispatch_queue_create("com.test.myQueueTag",DISPATCH_QUEUE_CONCURRENT);
//使用DISPATCH_QUEUE_CONCURRENT 就相当于是dispatch_get_global_queue 串行也同理
4.成组队列:dispatch_group_t group
= dispatch_group_create();
用法:多用于并行队列,多任务时
//在dispatch_queue中当所有的任务执行完成后想做其他操作
//在串行队列中(一般不需要用到group),可以把该操作放到最后一个任务执行完成后继续
//并行队列中,就用group的notify, dispatch_notify()是group结束的点
示例代码:
{
dispatch_group_async(group,globalQueue, ^{
[selfdosomething:@"A"];
});
dispatch_group_async(group,globalQueue, ^{
[selfdosomething:@"B"];
});
dispatch_group_notify(group,globalQueue, ^{
[selfdosomething:@"我最后执行"];
});
dispatch_group_async(group, globalQueue, ^{
[self dosomething:@"C"];
});
}//A,B,C并行执行,最后再执行notify
二、异步调度和同步调度(提交任务)
1.异步调度
dispatch_async : dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)
//把一个任务添加到某queue后就马上离开,而不管任务在那个queue里的执行状态(立即执行)
示例代码:
模板:
dispatch_async(globalQueue, ^{
//请求数据(分线程)
dispatch_async(mainQueue, ^{
//UI操作(主线程)
});
});
2.同步调度 dispatch_sync : dispatch_sync(<#dispatch_queue_t
queue#>, <#^(void)block#>)
//把一个任务添加到某queue后,等这个任务完成,调用线程才继续执行.(等前面的任务执行完)
三、GCD的更多用法
1.dispatch_once(整个工程只调用一次(可用于单例))
例:
{
staticdispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"只调用一次");
});
}
2.dispatch_apply(重复调用,调用多次)
dispatch_apply(<#size_t iterations#>, <#dispatch_queue_t queue#>, <#^(size_t)block#>)
例:
{ dispatch_apply(4,globalQueue, ^(size_t t) { NSLog(@"%ld",t); }); }
3.dispatch_after(延迟操作)
例:
dispatch_after(<#dispatch_time_t when#>, <#dispatch_queue_t queue#>, <#^(void)block#>)
{
doubledelayInSeconds =2.0;
dispatch_time_t popTime =dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
NSLog(@"2秒后执行");
});
}
4.dispatch_barrier_async(并行队列中,可充当分割线)
例:
{
dispatch_queue_t myQueue =dispatch_queue_create("myQueue",DISPATCH_QUEUE_CONCURRENT);
dispatch_async(myQueue, ^{
[selfdosomething:@"A"];
});
dispatch_async(myQueue, ^{
[selfdosomething:@"B"];
});
//分割
dispatch_barrier_async(myQueue, ^{
[selfdosomething:@"C"];
});
dispatch_async(myQueue, ^{
[selfdosomething:@"D"];
});
dispatch_async(myQueue, ^{
[selfdosomething:@"E"];
});
}
//A,B并行执行 然后执行C,再并行执行D,E
相关文章推荐
- Python3写爬虫(四)多线程实现数据爬取
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 如何成为一名专家级的开发人员
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- C#实现多线程的同步方法实例分析
- C#线程间不能调用剪切板的解决方法
- 浅谈chuck-lua中的多线程
- C#简单多线程同步和优先权用法实例
- C#多线程学习之(四)使用线程池进行多线程的自动管理
- C#多线程编程中的锁系统(三)
- C#线程同步的三类情景分析
- C#获取进程或线程相关信息的方法
- C#停止线程的方法
- C#子线程更新UI控件的方法实例总结
- C#多线程学习之(六)互斥对象用法实例