iOS 多线程-GCD

来源:互联网 发布:太原哪里购买知豆d3 编辑:程序博客网 时间:2024/06/09 14:56

GCD对于刚入门的程序猿猴来说乍看很神秘的样子,其实只要掌握了他的原理,就像我们用某个控件的代理方法一样简单。

摘自网上资料:

GCD,全称Grand Central Dispath,是苹果开发的一种支持并行操作的机制。它的主要部件是一个FIFO队列和一个线程池,前者用来添加任务,后者用来执行任务。

     GCD中的FIFO队列称为dispatch queue,它可以保证先进来的任务先得到执行(但不保证一定先执行结束)。

     通过与线程池的配合,dispatch queue分为下面两种:

  •      Serial Dispatch Queue -- 线程池只提供一个线程用来执行任务,所以后一个任务必须等到前一个任务执行结束才能开始。
  •      Concurrent Dispatch Queue -- 线程池提供多个线程来执行任务,所以可以按序启动多个任务并发执行。

    我们可以通过dispatch_queue_cretae来创建队列,然后用dispatch_release释放。比如下面两段代码分别创建串行队列和并行队列:

    [cpp] view plaincopy
    1. dispatch_queue_t serialQ = dispatch_queue_create("eg.gcd.SerialQueue", DISPATCH_QUEUE_SERIAL);  
    2. dispatch_async(serialQ, ^{  
    3.     // Code here  
    4. });  
    5. dispatch_release(serialQ);  
    6.   
    7. dispatch_queue_t concurrentQ = dispatch_queue_create("eg.gcd.ConcurrentQueue", DISPATCH_QUEUE_CONCURRENT);  
    8. dispatch_async(concurrentQ, ^{  
    9.     // Code here  
    10. });  
    11. dispatch_release(concurrentQ);  
1.其实刚开始我们用的最多的是在网络请求数据后刷新UI的时候用到他。而系统默认就有一个串行队列main_queue和并行队列global_queue,通常,我们可以在global_queue中做一些long-running的任务,完成后在main_queue中更新UI,避免UI阻塞,无法响应用户操作:

  1. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
  2.     // long-running task  
  3.     dispatch_async(dispatch_get_main_queue(), ^{  
  4.         // update UI  
  5.     });  
  6. }); 
我们可以在并行队列中做一些例如解析数据之类的一些操作,在主队列中去刷新UI。


2.dispatch_once这个函数,它可以保证整个应用程序生命周期中某段代码只被执行一次

[cpp] view plaincopy
  1. static dispatch_once_t onceToken;  
  2. dispatch_once(&onceToken, ^{  
  3.     // code to be executed once  
  4. });  

3.有时候我们需要等个几秒钟然后做个动画或者给个提示,这时候可以用dispatch_after这个函数:

[cpp] view plaincopy
  1. double delayInSeconds = 2.0;  
  2. dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);  
  3. dispatch_after(popTime, dispatch_get_main_queue(), ^(void){  
  4.     // code to be executed on the main queue after delay  
  5. });  


0 0
原创粉丝点击