多线程开发 - GCD的使用
来源:互联网 发布:amaze ui 知乎 编辑:程序博客网 时间:2024/06/06 00:17
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] block12014-11-04 17:18:04.921 下载[2859:60b] block22014-11-04 17:18:04.922 下载[2859:60b] block32014-11-04 17:18:04.922 下载[2859:60b] block42014-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 当前执行的次数)
0 0
- 多线程开发 - GCD的使用
- iOS开发多线程-GCD的基本使用
- 多线程GCD的使用
- 多线程GCD的使用
- 多线程GCD的使用
- 多线程GCD的使用
- 多线程GCD的使用
- 多线程GCD的使用
- 多线程GCD的使用
- 多线程GCD的使用
- 多线程GCD的使用
- GCD多线程的使用
- GCD多线程的使用
- GCD多线程的使用
- GCD多线程的使用
- GCD使用以及多线程开发
- iOS开发多线程篇—GCD的基本使用
- iOS开发多线程篇—GCD的基本使用
- abercrombie homme but she was stuffed into his mouth down to eat." Wang told reporter. Speaking of
- 解决js下跳转无referer的方法
- s3c2440裸机开发调试环境(MDK4.6,Jlink v8,mini2440)
- MFC之“数字时钟制作”笔记(一)
- leetcode Merge k Sorted Lists
- 多线程开发 - GCD的使用
- 关于BIEE不能正常启动
- Zend Framework 2多域名多模块部署
- 关于getchar函数的理解
- ORA-16179: incremental changes to "log_archive_dest_1" not allowed with SPFILE
- xcode6 使用MJRefresh时报错解决方法
- c中exit和return的区别
- Event 标签的运用
- oracle 写代码块 (可写游标,这些来处理数据)