GCD

作者: 米匠 | 来源:发表于2016-06-17 11:14 被阅读32次

    在没有使用GCD时,当app被按home键退出后,app仅有最多5秒钟的时候做一些保存或清理资源的工作。但是在使用GCD后,app最多有10分钟的时间在后台长久运行。这个时间可以用来做清理本地缓存,发送统计数据等工作。
    让程序在后台长久运行的示例代码如下:

    // 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的用法:

    // 后台执行:
    dispatch_async(dispatch_get_global_queue(0, 0), ^{ // something }); 
    
    // 主线程执行: 
    dispatch_async(dispatch_get_main_queue(), ^{ // something }); 
    
    // 一次性执行: 
    static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ // code to be executed once }); 
    
    // 延迟2秒执行: 
    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 
    }); 
    
    // 自定义
    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); 
    
    // 合并汇总结果 
    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), ^{ 
    // 汇总结果 
    });
    
    // 串行
    dispatch_queue_t aQueue = dispatch_queue_create("shunxun",DISPATCH_QUEUE_SERIAL);
    //任务1
    dispatch_async(aQueue, ^{
      NSLog(@"任务1");
    });
    //任务2
    dispatch_async(aQueue, ^{
      NSLog(@"任务2");
     });
    //任务3
    dispatch_async(aQueue, ^{
      NSLog(@"任务3");
    });
    dispatch_release(aQueue);
    

    相关文章

      网友评论

          本文标题:GCD

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