ios讲解迷惑深入浅出之GCD

17 篇文章 0 订阅
17 篇文章 0 订阅
一. 创建串行对列(默认的和自定义的)
#pragma mark ----- 创建串行队列  (鸡肋)
- (void)serialQueue
{
    // ===== 串行队列分两种(第1种. 主线程中的串行队列(主串行队列)   第2种. 自定义的串行队列)
    

/*************    第1种. 主线程中的串行队列(主串行队列)      *****************************************/
    
    // 第1种. 主线程中的串行队列(主串行队列)
    // dispatch_queue_GCD中表示一个队列
    dispatch_queue_t mainQueue = dispatch_get_main_queue();  // 现在创建一个主队列, 实际上就是把主线程取出来了
    
    // 往主队列中添加任务
   // <#dispatch_queue_t queue#>  参数一: 要添加任务的队列
    // <#^(void)block#>           参数二: 要执行的任务
    
     //  往串行队列中添加任务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种. 自定义的串行队列    ***********************************************/
    
    // 第2种. 自定义的串行队列
    // <#const char *label#>            参数一: 队列的标识符(注意: 是C语言的字符串 不要加@"")
    // <#dispatch_queue_attr_t attr#>   参数二: 队列的执行类型(串/并)
    // DISPATCH_QUEUE_SERIAL         代表串行的队列
    dispatch_queue_t myQueue = dispatch_queue_create("com.nn.www", DISPATCH_QUEUE_SERIAL);
   
    // 往自定义的串行上队列上添加任务
    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);
    });
    
    /*
     // number 不是1 就不是主线程, 是1就是主线程
     (自定义) 第 一 个任务, 所在线程:<NSThread: 0x7ff63862a780>{number = 2, name = (null)}, 是否是主线程:0
     (自定义) 第 二 个任务, 所在线程:<NSThread: 0x7ff63862a780>{number = 2, name = (null)}, 是否是主线程:0
     (自定义) 第 三 个任务, 所在线程:<NSThread: 0x7ff63862a780>{number = 2, name = (null)}, 是否是主线程:0
     */
    
    
  
    /**
        延迟回到主线程执行
     *  @param int64_t  <#delayInSeconds#>  延迟几秒的执行
        dispatch_get_main_queue(),  延迟几秒后回到主线程执行任务
     */
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"延迟五秒执行");
        NSLog(@"延迟任务, 所在线程:%@, 是否是主线程:%d", [NSThread currentThread], [NSThread currentThread].isMainThread);
        /*
         延迟任务, 所在线程:<NSThread: 0x7fdf40d27fd0>{number = 1, name = main}, 是否是主线程:1
         */
    });
    
    /**
     *  延迟执行
     *
     *  @param when#>  dispatch_time(DISPATCH_TIME_NOW, 6ull *NSEC_PER_SEC) description#>
     *  @param queue#> 自定义的队列 description#>
     */
    // dispatch_after(<#dispatch_time_t when#>, <#dispatch_queue_t queue#>, <#^(void)block#>)
    // 延迟执行
    //  <#dispatch_time_t when#>
    // C语言中, ull是字面量, 表示unsigned long类型
    
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 6ull *NSEC_PER_SEC), myQueue, ^{
        NSLog(@"延迟6秒执行");
    });
   
}

二. 创建并行对列(默认的和自定义的)

<span style="font-size:14px;">#pragma mark - 并行队列--------- 并发执行任务 (只有一块开始, 但是无法控制一块结束)
- (void)concurrentQueue
{
    
/******************** 创建并行对列 开始*****************************************************/
   
    // 创建默认的并行对列
   
    // 参数一: 队列的执行顺序       <#long identifier#>
    // 参数二: 预留参数, 一般填0    <#unsigned long flags#>
    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 ---- %d", [NSThread currentThread], [NSThread currentThread].isMainThread, i);
        }
    });
    
    
    // 添加任务2
    dispatch_async(queue, ^{
        for (int i = 10; i < 20 ; i++) {
            NSLog(@"第二个任务,所在线程:%@, 是否是主线程:%d ---- %d", [NSThread currentThread], [NSThread currentThread].isMainThread, i);
        }
    });
    
    
    // 添加任务3
    dispatch_async(queue, ^{
        for (int i = 20; i < 30; i++) {
            NSLog(@"第三个任务,所在线程:%@, 是否是主线程:%d ---- %d", [NSThread currentThread], [NSThread currentThread].isMainThread, i);
        }
    });
    */
/********************* 创建并行对列 结束****************************************************/
    

    
    
    
    
/****************  自定义并行队列  开始 ***************************************************/
//  2.自定义并行队列,需要自己手动创建,并设置队列为并行
    
    // 参数一 : 队列标识符(C语言的字符串)
    // 参数二 : 执行顺序(并/串)
    // DISPATCH_QUEUE_CONCURRENT 代表并行队列
    dispatch_queue_t myQueue = dispatch_queue_create("com.nn.www", DISPATCH_QUEUE_CONCURRENT);
    
    
    // 往队列中 添加任务1
    dispatch_async(myQueue, ^{
        for (int i = 0; i < 10 ; i++) {
            NSLog(@"(自定义并行队列)第一个任务,所在线程:%@, 是否是主线程:%d ---- %d", [NSThread currentThread], [NSThread currentThread].isMainThread, i);
        }
    
        
    });
    
    
    // 添加任务2
    dispatch_async(myQueue, ^{
        for (int i = 10; i < 20 ; i++) {
            NSLog(@"(自定义并行队列)第二个任务,所在线程:%@, 是否是主线程:%d ---- %d", [NSThread currentThread], [NSThread currentThread].isMainThread, i);
        }
    });
    
    
    // 添加任务3
    dispatch_async(myQueue, ^{
        for (int i = 20; i < 30; i++) {
            NSLog(@"(自定义并行队列)第三个任务,所在线程:%@, 是否是主线程:%d ---- %d", [NSThread currentThread], [NSThread currentThread].isMainThread, i);
        }
    });
/****************  自定义并行队列  结束 ***************************************************/
}</span><span style="font-size: 18px;">
</span>





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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值