iOS详解 GCD 串行队列并行队列

来源:互联网 发布:部落冲突黑油钻井数据 编辑:程序博客网 时间:2024/05/17 20:29
    //  串行队列 分两种      //  1.主队列      //  创建一个主队列      dispatch_queue_t mainQueue = dispatch_get_main_queue();      //  像主队列中添加任务      //  参数1 要添加的队列      //  参数2 要添加的任务      dispatch_async(mainQueue, ^{          NSLog(@"第一个任务,所在线程:%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);      });      dispatch_async(mainQueue, ^{          NSLog(@"第二个任务,所在线程:%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);      });            dispatch_async(mainQueue, ^{          NSLog(@"第三个任务,所在线程:%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);      });            //  任务延迟      dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(33 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{                    NSLog(@"延迟3秒执行");                });            //  ull 是C语言的数值字面量 相当于 unsigned long long      dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 55ull * NSEC_PER_SEC), mainQueue, ^{          NSLog(@"延迟5秒执行");      });            //  综上:串行主队列 都在主线冲中进行任务 结束一个 才能进入下一个  [objc] view plaincopy    //  2.自定义队列      //  创建一个队列      //  参数1 自定义队列的标示符 名字      //  参数2 自定义队列的种类 串行      dispatch_queue_t myQueue = dispatch_queue_create("com.wl.MyQueue", DISPATCH_QUEUE_SERIAL);      dispatch_async(myQueue, ^{          for (int i = 0; i < 10; i++) {              NSLog(@"第一个任务,所在线程:%@, 是否是主线程:%d-----%d", [NSThread currentThread], [NSThread currentThread].isMainThread,i);          }      });      dispatch_async(myQueue, ^{          for (int i = 10; i < 20; i++) {              NSLog(@"第二个任务,所在线程:%@, 是否是主线程:%d-----%d", [NSThread currentThread], [NSThread currentThread].isMainThread,i);          }      });      dispatch_async(myQueue, ^{          for (int i = 20; i < 30; i++) {              NSLog(@"第三个任务,所在线程:%@, 是否是主线程:%d-----%d", [NSThread currentThread], [NSThread currentThread].isMainThread,i);          }      });   [objc] view plaincopy        //  创建一个 并行队列          //  参数1 设置优先级 无优先级          //  参数2 预留参数 一般给0      //    dispatch_queue_t myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);      //    dispatch_async(myQueue, ^{      //        for (int i = 0; i < 10; i++) {      //            NSLog(@"第一个任务,所在线程:%@, 是否是主线程:%d-----%d", [NSThread currentThread], [NSThread currentThread].isMainThread,i);      //        }      //    });      //    dispatch_async(myQueue, ^{      //        for (int i = 10; i < 20; i++) {      //            NSLog(@"第二个任务,所在线程:%@, 是否是主线程:%d-----%d", [NSThread currentThread], [NSThread currentThread].isMainThread,i);      //        }      //    });      //    dispatch_async(myQueue, ^{      //        for (int i = 20; i < 30; i++) {      //            NSLog(@"第三个任务,所在线程:%@, 是否是主线程:%d-----%d", [NSThread currentThread], [NSThread currentThread].isMainThread,i);      //        }      //    });                                    // 2.自定义队列,需要自己手动创建,并设置队列为并行          dispatch_queue_t myQueue = dispatch_queue_create("com.lanou3g.ConcurrentQueue", DISPATCH_QUEUE_CONCURRENT);                    dispatch_async(myQueue, ^{              for (int i = 0; i < 10; i++) {                  NSLog(@"第一个任务,所在线程:%@, 是否是主线程:%d~~~~~~~~~~~%d", [NSThread currentThread], [NSThread currentThread].isMainThread, i);              }          });          dispatch_async(myQueue, ^{              for (int i = 10; i < 20; i++) {                  NSLog(@"第二个任务,所在线程:%@, 是否是主线程:%d~~~~~~~~~~~%d", [NSThread currentThread], [NSThread currentThread].isMainThread, i);              }          });          dispatch_async(myQueue, ^{              for (int i = 20; i < 30; i++) {                  NSLog(@"第三个任务,所在线程:%@, 是否是主线程:%d~~~~~~~~~~~%d", [NSThread currentThread], [NSThread currentThread].isMainThread, i);              }          });  [objc] view plaincopy    //  分组队列      - (void)group      {          // 创建分组          dispatch_group_t group = dispatch_group_create();          // 创建并行队列(全局队列)          dispatch_queue_t myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);          // 把myQueue添加到分组group中,并且给myQueue添加任务          dispatch_group_async(group, myQueue, ^{              for (int i = 0; i < 10; i++) {                  NSLog(@"第一个任务,所在线程:%@, 是否是主线程:%d~~~~~~~~~~~%d", [NSThread currentThread], [NSThread currentThread].isMainThread, i);              }          });          dispatch_group_async(group, myQueue, ^{              for (int i = 10; i < 20; i++) {                  NSLog(@"第二个任务,所在线程:%@, 是否是主线程:%d~~~~~~~~~~~%d", [NSThread currentThread], [NSThread currentThread].isMainThread, i);              }          });          // 在分组所有任务执行完成之后,最后指向下面的任务          dispatch_group_notify(group, myQueue, ^{              // 回到主线程刷新UI              dispatch_async(dispatch_get_main_queue(), ^{                  NSLog(@"当前的线程是: %@", [NSThread currentThread]);                  NSLog(@"所有数据下载完成.可以去刷新UI了");              });          });                    dispatch_group_async(group, myQueue, ^{              for (int i = 20; i < 30; i++) {                  NSLog(@"第三个任务,所在线程:%@, 是否是主线程:%d~~~~~~~~~~~%d", [NSThread currentThread], [NSThread currentThread].isMainThread, i);              }          });            }  [objc] view plaincopy    - (void)barrier      {          // 自己创建并行队列          dispatch_queue_t queue = dispatch_queue_create("com.lanou3g.Barrier", DISPATCH_QUEUE_CONCURRENT);          dispatch_async(queue, ^{              NSLog(@"玩家一读取完成");          });          dispatch_async(queue, ^{              NSLog(@"玩家二读取完成");          });          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, ^{              // 回到主线程,更新UI              dispatch_async(dispatch_get_main_queue(), ^{                  NSLog(@"------%d", [NSThread currentThread].isMainThread);                  NSLog(@"敌军即将在30秒后进入战场");              });          });                          }            //  只执行一次      - (void)onceBlock      {          static dispatch_once_t onceToken;          dispatch_once(&onceToken, ^{              NSLog(@"第一滴血");          });      }  

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信发出的文件无法撤回怎么办 微信群发错消息无法撤回怎么办 百度网盘登录要验证码怎么办 百度网盘备份记录怎么办能删掉 手机酷狗听歌耳机声音太小了怎么办 苹果6s微信通话声音变粗怎么办 千千静听多个列表合成一个了怎么办 别人用手机号注册了邮箱怎么办 微信身份信息验证未通过怎么办 快递地址填错了已经发到了怎么办 孩子威胁同学给她买东西吃怎么办 在超市买小孩米粉过期了怎么办 出口货物被海关扣了说仿牌怎么办 有一批仿牌被宁波海关查了怎么办 付了定金不想要车了怎么办 泥墙刮石灰上涂料现在刮腻子怎么办 月经最后一天同房了怎么办吃什么药 奶水太多了宝宝总是呛到了怎么办 婴儿刚吃完奶大量喷奶怎么办 我干活细致领导说我慢怎么办 怀孕初期吃了加明矾的粉皮怎么办 绿豆面黄豆面白面蒸馒头怎么办 画油画时把颜料染在衣服上怎么办 买的布衣柜少了一个管子怎么办 小2球刚好进2球怎么办 大2球刚好进2球怎么办 大球2进了2球怎么办 身上剩的几百块钱有掉了怎么办 刚买一天的手机电板有问题怎么办 宝宝长湿疹穿少了就感冒怎么办 照片跟视频被孩子删了怎么办 老公总是说一些不开心的话题怎么办 孩子沉迷手机篮球课不爱去怎么办 坐久了屁鼓会长疮怎么办 套胶的胶皮与海绵分离怎么办 换肾15天了沒尿怎么办? 妻子的绒癌怎么办?——急人! 孕妇结石掉在输尿管有血尿怎么办 吃葯时药片沾在食管臂上怎么办 八十多了膀胱癌手术复发了怎么办 尿蛋白和尿隐血2个加怎么办