iOS GCD使用_理解

Grand Central Dispath(GCD) 是在MacOS X10.6中退出,然后在IOS4.0中加以应用,相对于NSThread、NSOperation等更加方便

我们平时在访问网络时,必须要在子线程中进行,不然会造成主线程堵塞,更新界面等都在主线程中进行,如果主线程堵塞,那么界面将会卡的不动
下面是一段使用gcd访问网络的代码

    //子线程访问网络
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSURL *url = [NSURL URLWithString:@"www.test.com"];
        NSError *error;
        NSString *data = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
        if (data) {
            //主线程更新界面
            dispatch_async(dispatch_get_main_queue(), ^{
                self.content.text = data;
            });
        }else{
            NSLog(@"%@",error);
        }
    });

苹果为我们提供了一些方便我们使用的代码

    //后台执行-子线程执行
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        //doto
    });
    //主线程执行
    dispatch_async(dispatch_get_main_queue(), ^{
        //todo
    });
    //一次性执行
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        //todo
    });
    //延迟5秒执行
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        //todo
    });
返回主线程也可这么写
    //后台执行-子线程执行
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        //doto
        //返回主线程
        [self performSelectorOnMainThread:@selector(doSomething:) withObject:@"test" waitUntilDone:NO];
    });

- (void)doSomething:(NSString *)string{

}

gcd其他用法:

如:先执行其他线程, 此线程执行完后再执行最后的线程

    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
        //线程1
    });
    dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
        //线程2
    });
    dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
        //线程1和2执行完毕后执行此线程3
    });

注:

dispatch_get_global_queue(0, 0)即代表子线程
dispatch_get_main_queue()代表主线程

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值