1. 读取网络数据,IO和数据库操作的时候 dispatch_async
2. 如果遇到一系列的任务
3. 由于在使用 dispatch_async()函数提交并行任务时,不能确定执行顺序,如果需要确定某些任务的运行位置就需要用到dispatch_barrier_async()函数
比如
用于监听耗时事件是否完成
- (void)downloadOneImage:(NSURL *)url
{
url = [NSURL URLWithString:@"http://f11.topit.me/l/201012/23/12931084503799.jpg"];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *image = [UIImage imageWithData:data];
dispatch_async(dispatch_get_main_queue(), ^{
self.imageView.image = image;
});
});
}
2. 如果遇到一系列的任务
用dispatch_sync 方法串行执行时会出现效率低下的情况,同时dispatch_async 是非阻塞的,不能确定任务执行完成的时间
于是使用GCD提供的dispatch_group_t ,管理一组任务的下载,当所有任务下载完成调用
- (void)downloadGroupImage
{
// 创建全局队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
// 创建事件组
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
// 延迟3秒
[NSThread sleepForTimeInterval:3];
NSLog(@"image1");
});
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:3];
NSLog(@"image2");
});
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:3];
NSLog(@"image3");
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"finish");
});
}
3. 由于在使用 dispatch_async()函数提交并行任务时,不能确定执行顺序,如果需要确定某些任务的运行位置就需要用到dispatch_barrier_async()函数
比如
dispatch_queue_t queue = dispatch_get_current_queue();
dispatch_async(queue, ^{
NSLog(@"1");
});
dispatch_async(queue, ^{
NSLog(@"2");
});
dispatch_barrier_async(queue, ^{
NSLog(@"3");
});
dispatch_async(queue, ^{
NSLog(@"4");
});
dispatch_async(queue, ^{
NSLog(@"5");
});
打印信息
2014-11-04 17:18:04.920 下载[2859:60b] block1
2014-11-04 17:18:04.921 下载[2859:60b] block2
2014-11-04 17:18:04.922 下载[2859:60b] block3
2014-11-04 17:18:04.922 下载[2859:60b] block4
2014-11-04 17:18:04.923 下载[2859:60b] block
在这个函数中,首先执行1.2 当1.2执行完毕后 4.5才能够被执行
4. 如果需要执行某行代码N次使用 dispatch_apply
dispatch_apply(size_t iterations // 总共执行次数, dispatch_queue_t queue //执行的队列, ^(size_t)block //执行的代码块 size_t 当前执行的次数)