美文网首页
GCD 概述(二)

GCD 概述(二)

作者: 秀才不才 | 来源:发表于2016-07-01 16:36 被阅读8次
    dispatch_queue_create(const char *label, dispatch_queue_attr_t attr);
    该函数的第一个参数指定Serial Dispatch Queue的名称。推荐使用应用程序ID这种逆序全程域名。
    第二个参数,当生成Serial Dispatch Queue时,第二个参数设置NULL。
    当生成Concurrent Dispatch Queue,指定为DISPATCH_QUEUE_CONCURRENT
    dispatch_queue_t myConcurrentDispatchQueue = dispatch_queue_create("com.example.gcd.MyConcurrentDispatchQueue", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_suspend
    //挂起指定的Dispatch Queue.
    dispatch_suspend(queue)
    
    dispatch_resume
    //恢复指定的Dispatch Queue
    dispatch_resume(queue)
    
    dispatch_apply
    //该函数按指定的次数将指定的Block追加到指定的Dispatch Queue中,并等待全部处理执行结束。
    
    dispatch_queue_t queue = dispatch_get_global_queu(0, 0);
    dispatch_apply(10, queue, ^(size_t index){
        NSLog(@"%zu", index);
        });
    NSLog(@"done");
    
    NSArray *array = @[@"1", @"2", @"3", @"4", @"5", @"6"];
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    
    dispatch_async(queue, ^{
        dispatch_apply([array count], queue, ^(size_t index) {
            NSLog(@"%zu : %@", index, [array objectAtIndex:index]);
        });
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"currentThread = %@", [NSThread currentThread]);
            NSLog(@"done");
        });
    });
    
    dispatch_once
    //常用于单例
    //dispatch_once 函数是保证在应用程序执行中只执行一次指定处理的API
    //通过dispatch_once函数,即使在多线程环境下执行,也可能百分之百安全。
    static dispatch_once_t pred;
    dispatch_once(&pred, ^{
    /*
      *初始化
      */
    });
    
    dispatch队列还实现其它一些常用函数,包括:

    __void dispatch_apply(size_t iterations, dispatch_queue_t queue, void (^block)(size_t)); __
    //重复执行block,需要注意的是这个方法是同步返回,也就是说等到所有block执行完毕才返回,如需异步返回则嵌套在dispatch_async中来使用。多个block的运行是否并发或串行执行也依赖queue的是否并发或串行。

    __void dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block); __
    //这个函数可以设置同步执行的block,它会等到在它加入队列之前的block执行完毕后,才开始执行。在它之后加入队列的block,则等到这个block执行完毕后才开始执行。

    __void dispatch_barrier_sync(dispatch_queue_t queue, dispatch_block_t block); __
    //同上,除了它是同步返回函数

    __void dispatch_after(dispatch_time_t when, dispatch_queue_t queue, dispatch_block_t block); __
    //延迟执行block

    最后再来看看dispatch队列的一个很有特色的函数:

    __void dispatch_set_target_queue(dispatch_object_t object, dispatch_queue_t queue); __
    它会把需要执行的任务对象指定到不同的队列中去处理,这个任务对象可以是dispatch队列,也可以是dispatch源(以后博文会介绍)。而且这个过程可以是动态的,可以实现队列的动态调度管理等等。比如说有两个队列dispatchA和dispatchB,这时把dispatchA指派到dispatchB:
    dispatch_set_target_queue(dispatchA, dispatchB);
    那么dispatchA上还未运行的block会在dispatchB上运行。这时如果暂停dispatchA运行:
    dispatch_suspend(dispatchA);
    则只会暂停dispatchA上原来的block的执行,dispatchB的block则不受影响。而如果暂停dispatchB的运行,则会暂停dispatchA的运行。

    相关文章

      网友评论

          本文标题:GCD 概述(二)

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