【iOS开发-多线程】使用GCD创建多线程(iOS常用技术)
来源:互联网 发布:流量联网控制软件 编辑:程序博客网 时间:2024/05/22 06:13
GCD
全称是Grand Central Dispatch
特点:
- 自动利用CPU的多核技术
- 自动管理线程的生命周期
使用步骤
- 定制任务
- 将任务添加队列
各类队列的特点
关于同步和异步的两种执行方式
/** * 同步方式执行任务,不管是什么队列,都不会再开一个线程 */ dispatch_sync(<#dispatch_queue_t queue#>, ^{ <#code#> }) /** * 异步方式执行任务,除了主队列都会开启一个新线程 */ dispatch_async(<#dispatch_queue_t queue#>, ^{ <#code#> })
创建队列
全局并发队列
//获得全局的并发队列,第一个参数是优先级,一般都是0,第二个参数是预留的,也为0 dispatch_get_global_queue(<#long identifier#>, <#unsigned long flags#>)
使用
dispatch_queue_t queue = dispatch_get_global_queue(0, 0); /** * 同步方式执行任务 */ dispatch_sync(queue, ^{ NSLog(@"%@", NSThread.currentThread);//{number = 1, name = main} }); /** * 异步方式执行任务 */ dispatch_async(queue, ^{ NSLog(@"%@", NSThread.currentThread);//{number = 2, name = (null)} });
串行队列
//第一个参数是队列的名字,第二个参数为nildispatch_queue_create(<#const char *label#>, <#dispatch_queue_attr_t attr#>)
dispatch_queue_t queue = dispatch_queue_create("ttf", nil); /** * 同步方式执行任务 */ dispatch_sync(queue, ^{ NSLog(@"%@", NSThread.currentThread); }); /** * 异步方式执行任务 */ dispatch_async(queue, ^{ NSLog(@"%@", NSThread.currentThread); });
使用主队列
主队列不能和同步执行方式一起使用,不然会死锁
要使用异步的执行方式
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_queue_t queue = dispatch_get_main_queue(); /** * 同步方式执行任务 */// dispatch_sync(queue, ^{// NSLog(@"%@", NSThread.currentThread);// }); /** * 异步方式执行任务 */ dispatch_async(queue, ^{ NSLog(@"%@", NSThread.currentThread); });
线程之间的通讯
dispatch_async(dispatch_get_global_queue(0, 0), ^{ // 执行耗时的异步操作... dispatch_async(dispatch_get_main_queue(), ^{ // 回到主线程,执行UI刷新操作 });});
//异步下载图片
UIImageView *imageView = [[UIImageView alloc] init]; imageView.frame = CGRectMake(100, 100, 100, 100); imageView.backgroundColor = [UIColor redColor]; [self.view addSubview:imageView]; dispatch_queue_t queue = dispatch_get_global_queue(0, 0); dispatch_async(queue, ^{ NSURL *url = [NSURL URLWithString:@"http://img6.cache.netease.com/cnews/2015/5/13/20150513153022b6a55.jpg"]; NSData *data = [NSData dataWithContentsOfURL:url]; // 这行会比较耗时 UIImage *image = [UIImage imageWithData:data]; dispatch_async(dispatch_get_main_queue(), ^{ imageView.image = image; }); });
一次性代码
//代码整个程序只被执行一次
static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{ // 只执行1次的代码(这里面默认是线程安全的)});
队列组
可以吧几个线程加载到队列组里面,等这个组里面的线程全部执行完毕,再做其他事情
dispatch_group_t group = dispatch_group_create();dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 执行1个耗时的异步操作});dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 执行1个耗时的异步操作});dispatch_group_notify(group, dispatch_get_main_queue(), ^{ // 等前面的异步操作都执行完毕后,回到主线程...});
0 0
- 【iOS开发-多线程】使用GCD创建多线程(iOS常用技术)
- iOS中GCD多线程开发技术
- iOS开发 多线程GCD
- iOS多线程开发 -------- GCD
- ios 多线程开发 GCD
- iOS多线程开发:GCD
- iOS开发,多线程GCD
- iOS GCD多线程开发
- iOS多线程GCD使用
- ios多线程 GCD使用
- iOS GCD多线程使用
- IOS开发 GCD多线程编程技术(一)
- IOS开发 GCD多线程编程技术(二)
- iOS开发多线程-GCD的基本使用
- iOS开发—使用GCD实现多线程
- 【iOS开发-多线程】使用NSThread创建多线程
- iOS开发多线程GCD(二)
- IOS多线程开发之GCD
- Android 杂技
- 算法竞赛入门经典读书笔记(二)7.1简单枚举
- android中图片翻页效果简单的实现方法
- R语言-Error in file(out, "wt") : 无法打开链结问题解决
- PictureMarkerSymbol透明的问题
- 【iOS开发-多线程】使用GCD创建多线程(iOS常用技术)
- 怎么删除node_modules等Node安装包
- PHP开发环境的搭建
- oracle学习(一)
- 1039. 到底买不买(20):map应用
- css 条件注释区分非IE浏览器
- POJ 3273 Monthly Expense (二分搜索)
- Handler可能导致的内存泄漏及其优化
- 关于VC++6.0加载控件出现Unable to register this add-in because its DllRegisterServer returns an error 的解决方法