IOS GCD的5种队列用法和异步、同步操作
2015-03-25 19:59
344 查看
GCD的优点:1.GCD比thread更简单易用,基于Block的的特性导致它能在不同的代码块间传递上下文。
第一种:dispatch_queue
(1)Serial Dispatch Queue ---
等待现在正在执行的任务处理结束(串行)
(2)Concurrent Dispatch Queue ---
不等待现在正在执行的任务处理结束(并行、并发)
dispatch_queue_t queue1 = dispatch_queue_create("com.wxhl.gcd.Queue1", NULL);
dispatch_queue_t queue2 = dispatch_queue_create("com.wxhl.gcd.Queue2", DISPATCH_QUEUE_CONCURRENT); //并行的queue
//(2)创建要执行的任务,加到queue中执行
dispatch_async(queue2, ^{
for (int i = 0; i < 50; i ++) {
NSLog(@"GCD : %d", i);
}
});
dispatch_async(queue2, ^{
for (int i = 0; i < 50; i ++) {
NSLog(@"GCD2------ : %d", i);
}
});
第2种:dispatch_after
//dispatch_after
是过一段时间后,把任务加入到队列中
dispatch_time_t time =
dispatch_time(DISPATCH_TIME_NOW,
3ull *
NSEC_PER_SEC);
//NSEC_PER_SEC
秒
//NSEC_PER_MSEC
毫秒
//NSEC_PER_USEC
微秒
dispatch_after(time,
dispatch_get_main_queue(), ^{
NSLog(@"task 1");
});
//第二种方法
dispatch_after_f(dispatch_time(DISPATCH_TIME_NOW,
6ull*NSEC_PER_SEC),
dispatch_get_main_queue(), NULL,
fun);
//自己使用
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5ull
* NSEC_PER_SEC)),
dispatch_get_main_queue(), ^{
NSLog(@"task 3");
});
}
void fun(){
NSLog(@"task 2");
}
第3种:dispatch_group
//并行队列执行任务,在并行队列中加入多个串行队列
//disptch_group
dispatch_group_t group =
dispatch_group_create();
dispatch_queue_t queue =
dispatch_get_global_queue(0,
0);
dispatch_group_async(group, queue, ^{
NSLog(@"task 01");
});
dispatch_group_async(group, queue, ^{
NSLog(@"task 02");
});
dispatch_group_async(group, queue, ^{
sleep(6);//等待6秒执行任务3 目的:测试等待时间的dispatch_group_wait这个方法
NSLog(@"task 03");
});
dispatch_group_async(group, queue, ^{
sleep(2);
NSLog(@"task 04");
});
//监视函数
//监视队列中得任务结束,执行block中得任务
dispatch_group_notify(group, queue, ^{
NSLog(@"done");
});
//等待时间
dispatch_time_t time =
dispatch_time(DISPATCH_TIME_NOW,
5ull*NSEC_PER_SEC);
//dispatch_group_wait
指定时间后,看你一眼queue是否执行完毕
//如果执行完返回0
//没有执行完,返回非0值
long result = dispatch_group_wait(group, time);
if (result == 0) {
NSLog(@"finish");
}else{
NSLog(@"not finish");
}
}
第4种:dispatch_once(GCD实现单例)
//创建一个单例方法
+ (ShareOnce *)shanreInstence{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[ShareOnce
alloc] init];
NSLog(@"只执行1次");
});
return
instance;
}
//alloc会自动调用allocWithZone这个方法
//zone空间
自动分配内存空间 创建对象
+ (id)allocWithZone:(struct
_NSZone *)zone{
if (instance ==
nil) {
instance = [super
allocWithZone:zone];
}
return
instance;
}
//调用单例方法
[shareOnce shareInstance];
第5种:dispatch_semaphore
//使用
dispatch_queue_t queue =
dispatch_get_global_queue(0,
0);
dispatch_semaphore_t dsema =
dispatch_semaphore_create(1);
NSMutableArray *array = [NSMutableArray
array];
for (int i =
0; i < 1000; i++) {
dispatch_async(queue, ^{
dispatch_semaphore_wait(dsema,
DISPATCH_TIME_FOREVER);
[array
addObject:[NSNumber
numberWithInt:i]];
dispatch_semaphore_signal(dsema);
});
}
NSLog(@"%@", array);
第6种:异步操作:dispatch_async 同步操作:dispatch_sync
//dispatch sync
//
//async: asynchronous
将任务异步的追加到队列中
dispatch_async(dispatch_get_global_queue(0,
0), ^{
NSLog(@"async");
});
//sync: synchronous
将任务同步的追加到队列中(等队列中的任务执行完,再将任务追加到队列)
//是同步追加,不是任务同步执行,在串行队列中,任务才同步执行
dispatch_sync(dispatch_get_global_queue(0,
0), ^{
NSLog(@"sync");
});
//dispatch_sync的问题:容易产生死锁
//示例1:
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"hello");
});
NSLog(@"主线程");
//上述代码在主队列中执行指定的block,等待其执行结束
//而主队列中本来就在执行上述代码,无法执行追加的block
//示例2:
//串行的队列
dispatch_queue_t queue =
dispatch_queue_create("com.wxhl.GCD.queue",
NULL);
dispatch_async(queue, ^{
dispatch_sync(queue, ^{
NSLog(@"串行队列");
});
});
第一种:dispatch_queue
(1)Serial Dispatch Queue ---
等待现在正在执行的任务处理结束(串行)
(2)Concurrent Dispatch Queue ---
不等待现在正在执行的任务处理结束(并行、并发)
dispatch_queue_t queue1 = dispatch_queue_create("com.wxhl.gcd.Queue1", NULL);
dispatch_queue_t queue2 = dispatch_queue_create("com.wxhl.gcd.Queue2", DISPATCH_QUEUE_CONCURRENT); //并行的queue
//(2)创建要执行的任务,加到queue中执行
dispatch_async(queue2, ^{
for (int i = 0; i < 50; i ++) {
NSLog(@"GCD : %d", i);
}
});
dispatch_async(queue2, ^{
for (int i = 0; i < 50; i ++) {
NSLog(@"GCD2------ : %d", i);
}
});
第2种:dispatch_after
//dispatch_after
是过一段时间后,把任务加入到队列中
dispatch_time_t time =
dispatch_time(DISPATCH_TIME_NOW,
3ull *
NSEC_PER_SEC);
//NSEC_PER_SEC
秒
//NSEC_PER_MSEC
毫秒
//NSEC_PER_USEC
微秒
dispatch_after(time,
dispatch_get_main_queue(), ^{
NSLog(@"task 1");
});
//第二种方法
dispatch_after_f(dispatch_time(DISPATCH_TIME_NOW,
6ull*NSEC_PER_SEC),
dispatch_get_main_queue(), NULL,
fun);
//自己使用
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5ull
* NSEC_PER_SEC)),
dispatch_get_main_queue(), ^{
NSLog(@"task 3");
});
}
void fun(){
NSLog(@"task 2");
}
第3种:dispatch_group
//并行队列执行任务,在并行队列中加入多个串行队列
//disptch_group
dispatch_group_t group =
dispatch_group_create();
dispatch_queue_t queue =
dispatch_get_global_queue(0,
0);
dispatch_group_async(group, queue, ^{
NSLog(@"task 01");
});
dispatch_group_async(group, queue, ^{
NSLog(@"task 02");
});
dispatch_group_async(group, queue, ^{
sleep(6);//等待6秒执行任务3 目的:测试等待时间的dispatch_group_wait这个方法
NSLog(@"task 03");
});
dispatch_group_async(group, queue, ^{
sleep(2);
NSLog(@"task 04");
});
//监视函数
//监视队列中得任务结束,执行block中得任务
dispatch_group_notify(group, queue, ^{
NSLog(@"done");
});
//等待时间
dispatch_time_t time =
dispatch_time(DISPATCH_TIME_NOW,
5ull*NSEC_PER_SEC);
//dispatch_group_wait
指定时间后,看你一眼queue是否执行完毕
//如果执行完返回0
//没有执行完,返回非0值
long result = dispatch_group_wait(group, time);
if (result == 0) {
NSLog(@"finish");
}else{
NSLog(@"not finish");
}
}
第4种:dispatch_once(GCD实现单例)
//创建一个单例方法
+ (ShareOnce *)shanreInstence{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[ShareOnce
alloc] init];
NSLog(@"只执行1次");
});
return
instance;
}
//alloc会自动调用allocWithZone这个方法
//zone空间
自动分配内存空间 创建对象
+ (id)allocWithZone:(struct
_NSZone *)zone{
if (instance ==
nil) {
instance = [super
allocWithZone:zone];
}
return
instance;
}
//调用单例方法
[shareOnce shareInstance];
第5种:dispatch_semaphore
//使用
dispatch_queue_t queue =
dispatch_get_global_queue(0,
0);
dispatch_semaphore_t dsema =
dispatch_semaphore_create(1);
NSMutableArray *array = [NSMutableArray
array];
for (int i =
0; i < 1000; i++) {
dispatch_async(queue, ^{
dispatch_semaphore_wait(dsema,
DISPATCH_TIME_FOREVER);
[array
addObject:[NSNumber
numberWithInt:i]];
dispatch_semaphore_signal(dsema);
});
}
NSLog(@"%@", array);
第6种:异步操作:dispatch_async 同步操作:dispatch_sync
//dispatch sync
//
//async: asynchronous
将任务异步的追加到队列中
dispatch_async(dispatch_get_global_queue(0,
0), ^{
NSLog(@"async");
});
//sync: synchronous
将任务同步的追加到队列中(等队列中的任务执行完,再将任务追加到队列)
//是同步追加,不是任务同步执行,在串行队列中,任务才同步执行
dispatch_sync(dispatch_get_global_queue(0,
0), ^{
NSLog(@"sync");
});
//dispatch_sync的问题:容易产生死锁
//示例1:
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"hello");
});
NSLog(@"主线程");
//上述代码在主队列中执行指定的block,等待其执行结束
//而主队列中本来就在执行上述代码,无法执行追加的block
//示例2:
//串行的队列
dispatch_queue_t queue =
dispatch_queue_create("com.wxhl.GCD.queue",
NULL);
dispatch_async(queue, ^{
dispatch_sync(queue, ^{
NSLog(@"串行队列");
});
});
相关文章推荐
- IOS GCD的5种队列用法和异步、同步操作
- 【iOS】GCD队列、同步异步
- IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别(附代码)
- iOS-线程之GCD方式---之同步异步和串行队列并行队列之间的关系
- iOS中多线程知识总结:进程、线程、GCD、串行队列、并行队列、全局队列、主线程队列、同步任务、异步任务等
- iOS GCD/主队列/并行队列/全局队列/串行队列/同步任务/异步任务区别 含代码
- iOS学习笔记74-IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别附代码
- ios使用GCD来执行同步或异步串行、并行操作。
- ios-day19-02(GCD介绍。串行队列、并行队列、全局队列、主队列、同步任务、异步任务)
- iOS中多线程知识总结:进程、线程、GCD、串行队列、并行队列、全局队列、主线程队列、同步任务、异步任务等
- IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别(附代码)
- iOS-GCD学习之同步异步线程去执行串行操作
- IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别
- iOS GCD, 同步,异步,串行队列,并行队列,dispatch_group
- iOS中多线程知识总结:进程、线程、GCD、串行队列、并行队列、全局队列、主线程队列、同步任务、异步任务等(有示例代码)
- ios的线程和同步异步操作
- GCD 主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别
- iOS:对GCD中 同步、异步、并行、串行的见解
- ios GCD队列操作
- 理解 iOS 开发中 GCD 相关的同步(synchronization)\ 异步(asynchronization),串行(serial)\ 并行(concurrency)概念