GCD常用代码

GCD的核心

  • 将任务添加到队列
  • 任务 : 执行什么操作
  • 队列 : 用来存放任务

代码演练

任务添加到队列分开写

/// 队列+任务
- (void)gcdDemo1
{
    // 全局并发队列
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    // 任务
    void (^task)() = ^ {
        NSLog(@"%@",[NSThread currentThread]);
    };

    // 同步任务
//    dispatch_sync(queue, task);

    // 异步任务 : 每次执行任务的线程不一定是一样的
    dispatch_async(queue, task);

    NSLog(@"end");
}

简写

- (void)gcdDemo2
{
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"%@",[NSThread currentThread]);
    });
}

线程间通信

/// 线程间通信
- (void)gcdDemo3
{
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"下载中... %@",[NSThread currentThread]);

        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"下载完成 %@",[NSThread currentThread]);
        });
    });
}

使用GCD的线程间通信实现异步下载网络图片

- (void)downloadImage
{
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        // 获取网络图片地址
        NSURL *url = [NSURL URLWithString:@"http://photocdn.sohu.com/20151209/mp47379110_1449633737507_2_th.png"];
        // 获取网络图片二进制数据
        NSData *data = [NSData dataWithContentsOfURL:url];
        // 获取图片对象
        UIImage *image = [UIImage imageWithData:data];

        // 图片下载完成之后,回到主线程更新UI
        dispatch_async(dispatch_get_main_queue(), ^{
            // 设置图片视图
            self.imageView.image = image;
            // 图片视图自适应图片的大小
            [self.imageView sizeToFit];
            // 设置滚动视图
            [self.scrollView setContentSize:image.size];
        });
    });
}

总结 : 与 NSThread 的对比

  • 所有的代码写在一起的,让代码更加简单,易于阅读和维护
  • NSThread 通过 @selector 指定要执行的方法,代码分散
  • GCD 通过 block 指定要执行的代码,代码集中
  • 使用 GCD 不需要管理线程的创建/销毁/复用的过程.程序员不用关心线程的生命周期
  • 如果要开多个线程 NSThread 必须实例化多个线程对象
  • NSThread 靠 NSObject 的分类方法实现的线程间通讯,GCD 靠 block
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值