美文网首页iOS-OC中级
GCD 概述(一)

GCD 概述(一)

作者: 秀才不才 | 来源:发表于2015-12-22 15:53 被阅读20次
    1. dispatch_queue_t queue = dispatch_queue_create("com.dispatch.serial",DISPATCH_QUEUE_SERIAL);
      //生成一个串行队列,队列中的block按照先进先出(FIFO)的顺序去执行,实际上为单线程执行。第一个参数是队列的名称,在调试程序时会非常有用,所有尽量不要重名了。
    1. dispatch_queue_t queue = dispatch_queue_create("com.dispatch.concurrent",DISPATCH_QUEUE_CONCURRENT);
      //生成一个并发执行队列,block被分发到多个线程去执行
    1. dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
      //获得程序进程缺省产生的并发队列,可设定优先级来选择高、中、低三个优先级队列。由于是系统默认生成的,所以无法调用dispatch_resume()和dispatch_suspend()来控制执行继续或中断。需要注意的是,三个队列不代表三个线程,可能会有更多的线程。并发队列可以根据实际情况来自动产生合理的线程数,也可理解为dispatch队列实现了一个线程池的管理,对于程序逻辑是透明的。

    GCD用法

     //  后台执行:
     dispatch_async(dispatch_get_global_queue(0, 0), ^{
          // something
     });
    

    <p>

     // 主线程执行:
     dispatch_async(dispatch_get_main_queue(), ^{
          // something
     });
    

    <p>

     // 一次性执行:
     static dispatch_once_t onceToken;
     dispatch_once(&onceToken, ^{
         // code to be executed once
     });
    

    <p>

     // 延迟2秒执行:
     //第一个参数dispatch_time_t , 指定的时间开始。经常使用DISPATCH_TIME_NOW,表示现在的时间。
     //第二个参数指定的毫微秒单位时间 ,NSEC_PER_MSEC毫秒 ,NSEC_PER_SEC秒
     double delayInSeconds = 2.0;
     dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
     dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
         // code to be executed on the main queue after delay
     });
    

    <p>

     // 自定义dispatch_queue_t
     dispatch_queue_t urls_queue = dispatch_queue_create("blog.devtang.com", NULL);
     dispatch_async(urls_queue, ^{  
          // your code 
     });
     dispatch_release(urls_queue);
    

    <p>

     // 合并汇总结果
     dispatch_group_t group = dispatch_group_create();
     dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
          // 并行执行的线程一
     });
     dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
          // 并行执行的线程二
     });
     dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{
          // 汇总结果
     });
    

    GCD的另一个用处是可以让程序在后台较长久的运行。

    // AppDelegate.h文件
    @property (assign, nonatomic) UIBackgroundTaskIdentifier backgroundUpdateTask;
    
    // AppDelegate.m文件
    - (void)applicationDidEnterBackground:(UIApplication *)application
    {
        [self beingBackgroundUpdateTask];
        // 在这里加上你需要长久运行的代码
        [self endBackgroundUpdateTask];
    }
    
    - (void)beingBackgroundUpdateTask
    {
        self.backgroundUpdateTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
            [self endBackgroundUpdateTask];
        }];
    }
    
    - (void)endBackgroundUpdateTask
    {
        [[UIApplication sharedApplication] endBackgroundTask: self.backgroundUpdateTask];
        self.backgroundUpdateTask = UIBackgroundTaskInvalid;
    }
    

    转载自:这里

    相关文章

      网友评论

        本文标题:GCD 概述(一)

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