美文网首页
GCD之dispatch queue

GCD之dispatch queue

作者: iOS扫地僧 | 来源:发表于2018-03-02 15:43 被阅读0次

通过与线程池的配合,dispatch queue分为下面两种:而系统默认就有一个串行队列main_queue和并行队列global_queue
Serial Dispatch Queue -- 线程池只提供一个线程用来执行任务,所以后一个任务必须等到前一个任务执行结束才能开始。
Concurrent Dispatch Queue -- 线程池提供多个线程来执行任务,所以可以按序启动多个任务并发执行。

而系统默认就有一个串行队列main_queue和并行队列global_queue

dispatch_queue_t globalQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
dispatch_queue_t mainQ = dispatch_get_main_queue();  

通常,我们可以在global_queue中做一些long-running的任务,完成后在main_queue中更新UI,避免UI阻塞,无法响应用户操作:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
        // long-running task  
        dispatch_async(dispatch_get_main_queue(), ^{  
            // update UI  
        });  
    });  
Serial quque(private dispatch queue)

为了验证Serial queue的FIFO特性,写了如下的验证代码:发现的确是顺序执行的。

   NSDate *da = [NSDate date];
   NSString *daStr = [da description];
   const char *queueName = [daStr UTF8String];
   dispatch_queue_t myQueue = dispatch_queue_create(queueName, DISPATCH_QUEUE_SERIAL);
   
   dispatch_async(myQueue, ^{
       [NSThread sleepForTimeInterval:6];
       NSLog(@"[NSThread sleepForTimeInterval:6];");
   });
   
   dispatch_async(myQueue, ^{
       [NSThread sleepForTimeInterval:3];
       NSLog(@"[NSThread sleepForTimeInterval:3];");
   });
   
   dispatch_async(myQueue, ^{
       [NSThread sleepForTimeInterval:1];
       NSLog(@"[NSThread sleepForTimeInterval:1];");
   });

运行结果为:

2018-03-02 14:21:01.345524+0800 平常测试[7805:1368123] [NSThread sleepForTimeInterval:6];
2018-03-02 14:21:04.349350+0800 平常测试[7805:1368123] [NSThread sleepForTimeInterval:3];
2018-03-02 14:21:05.354546+0800 平常测试[7805:1368123] [NSThread sleepForTimeInterval:1];
Concurrent queue(global dispatch queue):

可以同时运行多个任务,每个任务的启动时间是按照加入queue的顺序,结束的顺序依赖各自的任务.使用dispatch_get_global_queue获得.

dispatch_queue_t myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    dispatch_async(myQueue, ^{
        [NSThread sleepForTimeInterval:6];
        NSLog(@"[NSThread sleepForTimeInterval:6];");
    });
    
    dispatch_async(myQueue, ^{
        [NSThread sleepForTimeInterval:3];
        NSLog(@"[NSThread sleepForTimeInterval:3];");
    });
    
    dispatch_async(myQueue, ^{
        [NSThread sleepForTimeInterval:1];
        NSLog(@"[NSThread sleepForTimeInterval:1];");
    });

运行结果为:

2018-03-02 15:25:59.861636+0800 平常测试[7883:1389164] [NSThread sleepForTimeInterval:1];
2018-03-02 15:26:01.860329+0800 平常测试[7883:1389161] [NSThread sleepForTimeInterval:3];
2018-03-02 15:26:04.861785+0800 平常测试[7883:1389163] [NSThread sleepForTimeInterval:6];

相关文章

  • GCD回顾

    GCD的API DISPATCH_QUEUE_SERIAL / DISPATCH_QUEUE_CONCURRENT...

  • OC中GCD使用

    一、GCD的使用: dispatch_async(dispatch_queue_t queue, dispatch...

  • GCD你所需要知道的

    Dispatch Queues GCD的基本概念就是dispatch queue。dispatch queue是一...

  • 多线程GCD

    1:GCD 创建队列: 串行队列: dispatch_queue_t queue=dispatch_queue_c...

  • Grand Central Dispatch

    GCD的API 1. Dispatch Queue Dispatch Queue分为两种 如何得到Dispatch...

  • GCD-源码分析

    GCD源码分析 dispatch_queue_create dispatch_queue_create队列创建方法...

  • GCD与Dispatch Queue

    什么是GCD与Dispatch Queue? GCD:是Grand Central Dispatch缩写,是App...

  • iOS多线程-GCD之Dispatch Group

    上一篇 iOS多线程-GCD之dispatch_set_target_queue 一、释义 dispatch_gr...

  • iOS常用代码块demo1

    1.GCD定时器 dispatch_queue_t queue = dispatch_get_global_que...

  • GCD研究

    //创建gcd容器(全局队列)并行 dispatch_queue_t queue0 = dispatch_get_...

网友评论

      本文标题:GCD之dispatch queue

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