GCD的一些简单使用
2016-10-20 11:26
162 查看
//创建一个多线程队列(并行和串行)
//串行
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(@"这是一个串行队列");
});
同步追加(不到万不得已不要使用)
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_t mainQueue = dispatch_get_main_queue();
<
4000
div>
//创建分组,监听队列中任务的执行
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);
});
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];
}
起线程名字的时候需要使用bundle id 加上 _线程的属性(serial 和concurrent) 然后_线程数
//串行
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(@"这是一个串行队列");
});
同步追加(不到万不得已不要使用)
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_t mainQueue = dispatch_get_main_queue();
<
4000
div>
//创建分组,监听队列中任务的执行
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);
});
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];
}
起线程名字的时候需要使用bundle id 加上 _线程的属性(serial 和concurrent) 然后_线程数
相关文章推荐
- [C++][MFC]CFile的一些简单使用
- symbian中活动对象的一些简单的使用
- iPhone获取当前位置(CoreLocation的一些简单使用)
- 【转】symbian中活动对象的一些简单的使用
- 先简单写一个,Linux下man命令使用的一些东东
- Oracle中日期的一些简单使用
- 关于使用PRO*C编程的一些简单说明和例子
- Oracle 日期的一些简单使用
- linux 的命令使用及一些简单常用的命令
- symbian中活动服务对象的一些简单的使用
- symbian中活动对象的一些简单的使用
- 关于使用PRO*C编程的一些简单说明和例子
- Request对象的一些简单使用
- 关于使用PRO*C编程的一些简单说明和例子
- Linux一些简单的使用技巧
- 关于使用PRO*C编程的一些简单说明和例子
- 关于使用PRO*C编程的一些简单说明和例子
- 关于sql时间函数的一些简单的例子(本机本地时间,国外服务器不能使用)
- .NET4中Task类和Parallel类的一些简单使用
- symbian中活动对象的一些简单的使用