iOS提供Grand Central Dispatch(GCD)来实现多线程。多线程的两个核心概念为:任务和队列。
队列:队列负责管理开发者提交的任务,GCD始终以FIFO(先进先出)的方式管理任务。
任务:用户提交给队列的工作单元。
1. Dispatch queue
执行任务的Dispatch queue有两种,分别为:顺序执行队列(Serial Dispatch Queue)和 并发执行队列(Concurrent Dispatch Queue)。
(1)创建队列
<1> dispatch_get_main_queue();
//获取当前应用的主线程所关联的串行队列
获取主线程所关联的串行队列并执行任务的示例代码如下所示:
dispatch_async(dispatch_get_main_queue(), ^{
// 要执行的代码
NSLog(@"dispatch_get_main_queue() %@",[NSThreadcurrentThread]);
});
<2> dispatch_get_global_queue(<#long identifier#>, <#unsigned long flags#>);
//获取全局的并发队列
第一个参数表示队列的优先级,分为五种。分别为:DISPATCH_QUEUE_PRIORITY_HIGH2 、DISPATCH_QUEUE_PRIORITY_DEFAULT0 、DISPATCH_QUEUE_PRIORITY_LOW (-2)和 DISPATCH_QUEUE_PRIORITY_BACKGROUND 。第二个参数暂未使用,一般传入0即可。
根据优先级等来获取全局队列并执行任务的示例代码如下所示:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT ,0 ), ^{
// 要执行的代码
NSLog(@"dispatch_get_global_queue %@",[NSThreadcurrentThread]);
});
<3> dispatch_queue_create(<#const char *label#>, <#dispatch_queue_attr_t attr#>)
//根据指定字符串标签创建队列 第一个参数表示创建的队列的标签,第二个参数设置为“DISPATCH_QUEUE_CONCURRENT”表示创建的队列为并发执行队列,设置为“DISPATCH_QUEUE_SERIAL”表示创建的队列为顺序执行队列
创建并发执行队列并执行任务的示例代码如下所示:
dispatch_queue_t queue =dispatch_queue_create("queueName.queue",DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
NSLog(@"dispatch_queue_create %@",[NSThreadcurrentThread]);
});
dispatch_queue_t queue = dispatch_queue_create("queueName.queue", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
NSLog(@"dispatch_queue_create %@",[NSThread currentThread]);
});
dispatch_async(dispatch_get_main_queue(), ^{
// 要执行的代码
NSLog(@"dispatch_get_main_queue() %@",[NSThread currentThread]);
});
示例代码如下所示:
dispatch_sync(dispatch_get_main_queue(), ^{
// 要执行的代码
NSLog(@"dispatch_get_main_queue() %@",[NSThread currentThread]);
});
示例代码如下所示:
dispatch_apply(10,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^(size_t index) {
NSLog(@"1111111111111111");
});
<4> void dispatch_once(dispatch_once_t *predicate,dispatch_block_t block);
//将任务以代码块的形式提交给队列,并保证在应用的生命周期中只执行一次。
示例代码如下所示:
-(void)TestDispatch_once
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@" onceToken; onceToken; ");
});
}
<5> void dispatch_after(dispatch_time_t when,dispatch_queue_t queue,dispatch_block_t block);
//将任务以代码块的形式提交给队列,并设置该任务延时执行
示例代码如下所示:
-(void)TestDispatch_after
{
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds *NSEC_PER_SEC);
dispatch_after(popTime,dispatch_get_main_queue(), ^(void){
NSLog(@"after ; after;");
});
}