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
- iOS经典讲解之多线程GCD的应用
- iOS经典讲解之多线程应用场景
- IOS之多线程GCD
- ios 之多线程 GCD
- iOS开发之多线程GCD
- iOS开发之多线程GCD
- ios开发之多线程GCD
- iOS 开发之多线程的应用场景
- iOS 开发之多线程之GCD
- iOS疯狂详解之多线程GCD
- IOS开发之多线程与GCD
- IOS开发之多线程与GCD
- iOS开发之多线程(GCD介绍)
- ios开发之多线程--GCD介绍
- iOS开发之多线程编程:GCD
- iOS开发实践之多线程(GCD)
- iOS之多线程开发(NSThread,NSOperation,GCD)
- ios之多线程-NSThead、GCD、NSOperationQueue
- 模仿R语言c++ 向量类c 矩阵类matrix等(持续更新 欢迎指点)
- jvm 基础 性能监控工具
- android JNI开发C++代码对assets文件的访问
- Android IntentService的使用
- Android 设计模式
- iOS经典讲解之多线程GCD的应用
- 关于rpm 命令的--changelog参数
- 使用线性布局LinearLayout
- 反网络爬虫
- 预处理伯努利数(多项式求逆)
- C++11中的右值引用及move语义编程
- 01-swift的简单了解
- Hibernate关联关系之双向1—n
- PHP 性能分析第二篇: Xhgui In-Depth