【iOS开发-多线程】使用GCD创建多线程(iOS常用技术)
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)}
});
串行队列
//第一个参数是队列的名字,第二个参数为nil
dispatch_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(), ^{
// 等前面的异步操作都执行完毕后,回到主线程...
});
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。