多线程开发 - GCD的使用

1.  读取网络数据,IO和数据库操作的时候 dispatch_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 当前执行的次数) 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值