iOS经典讲解之多线程GCD的应用

来源:互联网 发布:国泰安数据库好用吗 编辑:程序博客网 时间:2024/06/08 11:13
@implementation RootViewController- (void)viewDidLoad {    [super viewDidLoad];   // [self serialQueue];   // [self concurrentQueue];      [self gameStar];   }#pragma mark ----------------创建串行队列两种方式--------------------// 创建串行队列- (void)serialQueue{    // 串行队列分两种    //1、主线程的串行队列(主串队列)    // dispatch_queue_t GCD中表示一个队列    // 创建一个主队列 实际上就是把主线程取出来    dispatch_queue_t mainQueue = dispatch_get_main_queue();    // 添加任务1    // 参数一 要添加任务的队列    // 参数二 要执行的任务    dispatch_async(mainQueue, ^{                NSLog(@"第一个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);    });    // 添加任务2    dispatch_async(mainQueue, ^{                 NSLog(@"第二个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);    });    // 添加任务3    dispatch_async(mainQueue, ^{         NSLog(@"第三个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);    });            // 2、自定义的串行队列    //创建一个自定义的线程队列    // 参数1 队列的标示符 (C语言字符串)    // 参数2 队列的执行类型(串/并)    //DISPATCH_QUEUE_SERIAL 串行    dispatch_queue_t myQueue = dispatch_queue_create("com.lxl", DISPATCH_QUEUE_SERIAL);    // 添加任务1    dispatch_async(myQueue, ^{                NSLog(@"--第一个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);    });        // 添加任务2    dispatch_async(myQueue, ^{                NSLog(@"--第二个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);    });    // 添加任务3    dispatch_async(myQueue, ^{        NSLog(@"--第三个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);    });        //延迟回到主线程执行    //<#delayInSeconds#>填延迟几秒执行    // 延迟几秒后回到主线程执行任务    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{                NSLog(@"延迟5秒执行");         NSLog(@"延迟任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);    });        // 延迟执行    // 参数2 <#dispatch_queue_t queue#> 自定义队列    // C语言中 ull 是字面量 表示unsigned long long    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 6ull), myQueue, ^{               NSLog(@"延迟6秒执行");         NSLog(@"延迟任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);    });    }#pragma mark -------------------创建并行队列两种方式------------------------// 创建并行队列- (void)concurrentQueue{        // 创建一个队列    // 参数1 队列的执行顺序 默认的    // 参数2 预留参数 一般填0    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);    // 添加任务1    dispatch_async(queue, ^{                for (int i = 0; i < 10; i++) {                        NSLog(@"第一个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);        }    });    // 添加任务2    dispatch_async(queue, ^{                for (int i = 0; i < 10; i++) {                        NSLog(@"第二个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);        }    });    // 添加任务3    dispatch_async(queue, ^{                for (int i = 0; i < 10; i++) {                        NSLog(@"第三个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);        }    });            // 自定义并行队列    // 参数1 队列标识符    // 参数2 执行顺序(串/ 并) DISPATCH_QUEUE_CONCURRENT并行队列    dispatch_queue_t myQueue = dispatch_queue_create("com.www", DISPATCH_QUEUE_CONCURRENT);    // 添加任务1    dispatch_async(myQueue, ^{                        for (int i = 0; i < 10; i++) {                        NSLog(@"第一个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);        }    });    // 添加任务2    dispatch_async(myQueue, ^{                for (int i = 0; i < 10; i++) {                        NSLog(@"第二个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);        }    });    // 添加任务3    dispatch_async(myQueue, ^{                        for (int i = 0; i < 10; i++) {                        NSLog(@"第三个任务,所在线程%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);        }    });}#pragma mark -------------模拟游戏开始的线程操作--添加屏障------------------------// 模拟游戏开始的线程操作- (void)gameStar{    // 需求 一共四玩家一起进入游戏 当所有人都进入游戏的时候 开始读取数据    // 思路:    //1、选取什么队列 并行    //2、如何实现特殊要求 把并行队列用屏障隔开    //屏障的作用:把队列分成上下部 分开执行        // 创建一个并行队列    dispatch_queue_t queue = dispatch_queue_create("com.game", DISPATCH_QUEUE_CONCURRENT);    // 添加任务1    dispatch_async(queue, ^{                NSLog(@"玩家一进入游戏");            });    // 添加任务2    dispatch_async(queue, ^{                NSLog(@"玩家二进入游戏");            });    // 添加任务3    dispatch_async(queue, ^{                NSLog(@"玩家三进入游戏");            });        // 设置屏障    dispatch_barrier_async(queue, ^{    NSLog(@"等待其他玩家进入...");    });       // 添加读取信息任务    // 玩家一读取完成    dispatch_async(queue, ^{        NSLog(@"玩家一读取信息");    });    // 玩家二读取完成    dispatch_async(queue, ^{        NSLog(@"玩家二读取信息");    });    // 玩家三读取完成    dispatch_async(queue, ^{        NSLog(@"玩家三读取信息");    });    // 主线程进入游戏    // 再加一个屏障 进入主线程刷新界面    dispatch_barrier_async(queue, ^{                // 回到主线程 相当于给主线程添加一个任务        dispatch_async(dispatch_get_main_queue(), ^{                        NSLog(@"回到主线程 刷新界面 开始界面");                    });    });    }
1 0
原创粉丝点击