iOS笔记---GCD篇(3)

作者: 七号萝卜 | 来源:发表于2016-03-27 21:32 被阅读76次

    GCD里面一些剩余的常用的API

    dispatch_sync

    前面开线程一直用的是dispatch_async,这是代表异步。有异步就有同步,同步就是dispatch_sync。两者区别:async在将指定的Block追加到Dispatch Queue时,不会做任何等待;而sync在将Block追加是,线程会一直等待。调用dispatch_sync函数,在指定的处理执行结束之前,该函数不会返回,会处于等待状态,因此容易产生死锁。
    dispatch_sync与dispatch_async用法一样。

    dispatch_set_target_queue

    这个是用来变更Dispatch Queue的执行优先级的。

    平时我们用Global的时候倒是可以直接指定优先级,但当我们用dispatch_queue_create函数生成队列的时候,每一个队列的优先级都是默认优先级的。通过这个函数就能够更改优先级。

    dispatch_queue_t myDispatchQueue = dispatch_queue_create("com.wang.MyQueue",NULL);
    
    dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0);
    
    dispatch_set_target_queue(myDispatchQueue,globalQueue);
    

    此函数有两个参数,参数解释:

    • 参数一:就是想要变更执行优先级的队列。
    • 参数二:要变化到那个优先级的对应队列。

    上面即是将myDispatchQueue变更到和globalQueue同一个优先级。

    dispatch_after

    这个API在项目中很常用。因为经常会有这样的需求:某个任务想要在几秒后执行。这个函数就可以实现。

    dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW,3*NSEC_PER_SEC);
    dispatch_after(time,dispatch_get_main_queue(),^{ NSLog(@"3秒后执行");});
    

    只是这个处理的是大致延迟。因为在主线程中,RunLoop每隔1/60秒执行一次,即Block中的任务最快3秒后执行,最慢3秒+1/60秒执行。如果是有严格时间的要求情况下,这种方法就不适用了。
    参数解释:

    • 参数一:时间,如上面代码那样声明,是dispatch_time_t类型。
    • 参数二:要追加处理的队列。
    • 参数三:任务Block。

    dispatch_once

    这也是个非常常用的函数,尤其是单例模式的时候,经常用到它。它能保证在应用程序执行中只执行一次指定处理。能够使之在多线程环境下执行时保证百分之百安全。

    + (instancetype)sharePhotoTool
    {
         static dispatch_once_t onceToken; 
         dispatch_once(&onceToken, ^{ 
              sharePhotoTool = [[self alloc] init];
          });
         return sharePhotoTool;
    }
    

    Dispatch Group

    有时候需多个线程执行完后,再来执行某一个处理,就需用到这个。

    如我们将几个任务加入Global队列中,而Global队列是Concurrent队列,几个任务会同时开始。我们要使这些任务全都执行完毕,再在主线程中执行任务,即下面代码:

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
    dispatch_group_t group = dispatch_group_create();
    
    dispatch_group_async(group,queue.^{ NSLog(@"任务1");});
    dispatch_group_async(group,queue.^{ NSLog(@"任务2");});
    dispatch_group_async(group,queue.^{ NSLog(@"任务3");});
    
    dispatch_group_notify(group,dispatch_get_main_queue(),^{ NSLog(@"最后执行这个主线程里的任务");});
    

    相关文章

      网友评论

      • cookov:dispatch_set_target_queue 这个是用来给自已创建的队列设置目标队列的。每一个队列都有一个目标队列,block任务最终是在目标队列中完成的。

      本文标题:iOS笔记---GCD篇(3)

      本文链接:https://www.haomeiwen.com/subject/hokjlttx.html