iOS开发中的多线程的GCD用法

GCD (grand center dispatch)
GCD中只有两种类型的队列 - 串行, 并行(dispatch_queue_t)
// 一:
 // 1.串行 (任务一个个的执行)
    // 1.1 系统自带的, 系统自带的串行队列是主线程队列
    dispatch_queue_t systemSerial = dispatch_get_main_queue();
    // 1,2 自己创建, 都是子线程
    // 只要是 GCD 自己创建的队列,在 MRC下面需要进行释放, dispatch_release(自己创建队列的名字);
    dispatch_queue_t createSerial = dispatch_queue_create("com.shaoqiong.createSerial1", DISPATCH_QUEUE_SERIAL);
    // DISPATCH_QUEUE_SERIAL,serlal - 串行

    // 2.并行
    // 2.1 系统自带
    // 参数1:队列优先级,选择默认的
    // 参数2:预留参数,苹果公司的补充,没有任何作用
    // *子线程队列, 也就是说,将来该队列中执行的任务,都是在子线程中完成
    // 该方法常用, //dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DERAULT,0);
    dispatch_queue_t systemConcurrent = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    // 2.2 自己创建
    dispatch_queue_t createConcurrent = dispatch_queue_create("com.currentQueue", DISPATCH_QUEUE_CONCURRENT);
    //  DISPATCH_QUEUE_CONCURRENT, concurrent,并行


//二:
 // 向队列中添加任务, 在队列中执行这个任务, dispatch_async(异步),
 // 任务1:
//    systemConcurrent,并行队列
    dispatch_async( createSerial, ^{
     // 放置耗时的操作
        NSLog(@"----%d",[NSThread isMainThread]);
        for (int i = 0; i < 100; i++) {
            NSLog(@"AAA");
        }

    });
    // 任务2:
    dispatch_async(createSerial, ^{
        for (int i = 0; i < 100; i++) {
            NSLog(@"BBB");
        }
    });
// 最终, 这两个任务因为是并列的, 所以,打印出来的结果是随机的.

// 三:
广告弹出几秒就消失,延迟
 // 参数1:想推迟的秒数,dispatch_after,单位是:秒
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        //
        NSLog(@"---%d",[NSThread isMainThread]);
    });

// 四:
// 只执行一次的函数(无论哪一个线程都只走一次),dispatch_once(单列),dispatch_once
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        // 只执行一次的代码
    });
    */
    // 封装网络请求的单列
    #import "NetworkHelper.h"
@implementation NetworkHelper
// 可能手写!!(面试)
+ (NetworkHelper *)shareNetworkHelper {
    static NetworkHelper *netHelper = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        netHelper = [[NetworkHelper alloc]init];
    });
    return netHelper;
}
@end
//五:重复执行,dispatch_apply
// 参数1:执行次数
    // 参数2:队列 (使用子线程队列) --线程死锁
    // 参数3:t,要自己写,第几次运行
    dispatch_apply(5,  createSerial, ^(size_t t) {
        //
        NSLog(@"49班学习很棒%lu",t);
    });

//六:
 // GCD - 分组 (UI 界面有五大分区显示内容, 比设置障碍效率高) dispatch_group_async
    /*
    // 创建一个分组 dispatch_group_t, group 分组标记,
    dispatch_group_t creatGroup = dispatch_group_create();
    dispatch_group_async(creatGroup, createConcurrent, ^{
       // 想检测的任务1 (A B C 完成后 - 请求数据 ,在执行 D - 显示数据)
        NSLog(@"AAAA");
    });
    dispatch_group_async(creatGroup, createConcurrent, ^{
        //
        NSLog(@"BBB");
    });
    dispatch_group_async(creatGroup, createConcurrent, ^{
        //
        NSLog(@" CCC");
    });

    // 分组有这样一个特性: 标记在组中的任务, 都完成之后, 可以通知(dispatch_group_notify)下面函数的执行
    dispatch_group_notify(creatGroup, systemSerial, ^{
        //
        NSLog(@"主线程刷新 UI -- %d",[NSThread isMainThread]);
    });
    */

// 七:
// **调整线程的次序(线程同步) - (C需要一直在 AB 后面 - NSOperation,的依赖)
    // 障碍 dispatch_barrier_async
    /*
    dispatch_async(createConcurrent, ^{
        //
        for (int i = 0; i < 100; i++) {
            NSLog(@"AAAA");
        }
    });

    dispatch_async(createConcurrent, ^{
        //
        for (int i = 0; i < 100; i++) {
            NSLog(@"BBBB");
        }
    });
    // 添加一个障碍 barrier
    dispatch_barrier_async(createConcurrent, ^{
        //
        NSLog(@"我是一道墙");
    });

    dispatch_async(createConcurrent, ^{
        //
        for (int i = 0; i < 100; i++) {
            NSLog(@"CCCC");
        }
    });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值