//创建一个多线程队列(并行和串行)
//串行
dispatch_queue_t serialQueue = dispatch_queue_create("com.life.little kid serial", DISPATCH_QUEUE_SERIAL);
//并行
dispatch_queue_t concurrentQueue = dispatch_queue_create("com.like.little gril", DISPATCH_QUEUE_CONCURRENT);
异步追加
dispatch_async(serialQueue, ^{
NSLog(@"这是一个串行队列");
NSLog(@"这是一个串行队列");
});
同步追加(不到万不得已不要使用)
dispatch_async(concurrentQueue, ^{
NSLog(@"这是一个并行队列");
});
/*
优先级
* - DISPATCH_QUEUE_PRIORITY_HIGH: QOS_CLASS_USER_INITIATED
* - DISPATCH_QUEUE_PRIORITY_DEFAULT: QOS_CLASS_DEFAULT
* - DISPATCH_QUEUE_PRIORITY_LOW: QOS_CLASS_UTILITY
* - DISPATCH_QUEUE_PRIORITY_BACKGROUND: QOS_CLASS_BACKGROUND
*/
//获取全局队列(并行)
dispatch_queue_t queue1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//获取主队列,串行
});
/*
优先级
* - DISPATCH_QUEUE_PRIORITY_HIGH: QOS_CLASS_USER_INITIATED
* - DISPATCH_QUEUE_PRIORITY_DEFAULT: QOS_CLASS_DEFAULT
* - DISPATCH_QUEUE_PRIORITY_LOW: QOS_CLASS_UTILITY
* - DISPATCH_QUEUE_PRIORITY_BACKGROUND: QOS_CLASS_BACKGROUND
*/
//获取全局队列(并行)
dispatch_queue_t queue1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//获取主队列,串行
dispatch_queue_t mainQueue = dispatch_get_main_queue();
//创建分组,监听队列中任务的执行
dispatch_group_t group = dispatch_group_create ();
dispatch_queue_t queue = dispatch_get_global_queue (0, 0);
dispatch_group_async (group, queue, ^{
NSLog ( @"1.洗菜" );
});
dispatch_group_async (group, queue, ^{
sleep (10);
NSLog ( @"2.切菜" );
});
dispatch_group_async (group, queue, ^{
sleep (2);
NSLog ( @"3.炒菜" );
});
dispatch_group_async (group, queue, ^{
NSLog ( @"4.上菜" );
});
/*
//所有任务执行完,会通知group
dispatch_group_notify(group, queue, ^{
//收尾的任务
NSLog(@"吃菜");
});
*/
//group到达某一个时间点,在时间点去查看任务执行的进度
//when,参照时间点
//delta,时间偏移量
dispatch_time_t time = dispatch_time ( DISPATCH_TIME_NOW , 5 * NSEC_PER_SEC );
long result = dispatch_group_wait (group, time); //wait操作会阻塞当前的线程
if (result == 0) {
NSLog ( @"任务执行完" );
NSLog ( @"吃菜" );
} else {
NSLog ( @"有些任务没有执行完" );
}
dispatch_group_t group = dispatch_group_create ();
dispatch_queue_t queue = dispatch_get_global_queue (0, 0);
dispatch_group_async (group, queue, ^{
NSLog ( @"1.洗菜" );
});
dispatch_group_async (group, queue, ^{
sleep (10);
NSLog ( @"2.切菜" );
});
dispatch_group_async (group, queue, ^{
sleep (2);
NSLog ( @"3.炒菜" );
});
dispatch_group_async (group, queue, ^{
NSLog ( @"4.上菜" );
});
/*
//所有任务执行完,会通知group
dispatch_group_notify(group, queue, ^{
//收尾的任务
NSLog(@"吃菜");
});
*/
//group到达某一个时间点,在时间点去查看任务执行的进度
//when,参照时间点
//delta,时间偏移量
dispatch_time_t time = dispatch_time ( DISPATCH_TIME_NOW , 5 * NSEC_PER_SEC );
long result = dispatch_group_wait (group, time); //wait操作会阻塞当前的线程
if (result == 0) {
NSLog ( @"任务执行完" );
NSLog ( @"吃菜" );
} else {
NSLog ( @"有些任务没有执行完" );
}
GCD apply
//第一个参数,迭代的次数
dispatch_apply (array. count , dispatch_get_global_queue (0, 0), ^( size_t i) { /*size_t i 迭代变量*/
NSNumber *num = array[i];
float f = [num floatValue ];
NSLog ( @"%.4f" , f);
dispatch_apply (array. count , dispatch_get_global_queue (0, 0), ^( size_t i) { /*size_t i 迭代变量*/
NSNumber *num = array[i];
float f = [num floatValue ];
NSLog ( @"%.4f" , f);
});
GCD实现单例
//ARC
定义一个类方法
+ (
instancetype
)sharedChairman {
static dispatch_once_t onceToken;
dispatch_once (&onceToken, ^{
//保证block中的代码,在整个App的生命周期中只执行一次
instance = [[ super allocWithZone : nil ] init ];
});
return instance ;
}
- ( id )copy {
return self ;
}
//防止alloc方法,创建一个新的对象
//alloc 方法会自动调用allocWithZone:nil
+ ( instancetype )allocWithZone:( struct _NSZone *)zone {
// [super allocWithZone:zone]
return [ self sharedChairman ];
static dispatch_once_t onceToken;
dispatch_once (&onceToken, ^{
//保证block中的代码,在整个App的生命周期中只执行一次
instance = [[ super allocWithZone : nil ] init ];
});
return instance ;
}
- ( id )copy {
return self ;
}
//防止alloc方法,创建一个新的对象
//alloc 方法会自动调用allocWithZone:nil
+ ( instancetype )allocWithZone:( struct _NSZone *)zone {
// [super allocWithZone:zone]
return [ self sharedChairman ];
}
起线程名字的时候需要使用bundle id 加上 _线程的属性(serial 和concurrent) 然后_线程数