dispatch_set_target_queue

来源:互联网 发布:mac电源适配器拆解 编辑:程序博客网 时间:2024/06/03 05:23

ispatch_set_target_queue的两个作用:

 

酷用来给新建的queue设置优先级:

Java代码  收藏代码
  1. dispatch_queue_t serialQueue = dispatch_queue_create("com.oukavip.www",NULL);  
  2. dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0);  
  3.    
  4. dispatch_set_target_queue(serialQueue, globalQueue);  
  5. /* * 第一个参数为要设置优先级的queue,第二个参数是参照物,既将第一个queue的优先级和第二个queue的优先级设置一样。 
  6.      */  

需要注意的是,第一个参数是自定义的queue(默认优先级就是global queue的default),而不是系统的queue(global/main)。因为你不能给系统的queue设置权限。通过上面设置,serialQueue 就有了与globalQueue一样的优先级。其实这个函数不仅可以设置queue的优先级,还可以设置queue之间的层级结构。

 

酷修改用户队列的目标队列,使多个serial queue在目标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的运行。

demo:

一般都是把一个任务放到一个串行的queue中,如果这个任务被拆分了,被放置到多个串行的queue中,但实际还是需要这个任务同步执行,那么就会有问题,因为多个串行queue之间是并行的。这时使用dispatch_set_target_queue将多个串行的queue指定到了同一目标,那么着多个串行queue在目标queue上就是同步执行的,不再是并行执行。

Java代码  收藏代码
  1. +(void)testTargetQueue {  
  2.     dispatch_queue_t targetQueue = dispatch_queue_create("test.target.queue", DISPATCH_QUEUE_SERIAL);  
  3.       
  4.       
  5.       
  6.     dispatch_queue_t queue1 = dispatch_queue_create("test.1", DISPATCH_QUEUE_SERIAL);  
  7.     dispatch_queue_t queue2 = dispatch_queue_create("test.2", DISPATCH_QUEUE_SERIAL);  
  8.     dispatch_queue_t queue3 = dispatch_queue_create("test.3", DISPATCH_QUEUE_SERIAL);  
  9.       
  10.     dispatch_set_target_queue(queue1, targetQueue);  
  11.     dispatch_set_target_queue(queue2, targetQueue);  
  12.     dispatch_set_target_queue(queue3, targetQueue);  
  13.       
  14.       
  15.     dispatch_async(queue1, ^{  
  16.         NSLog(@"1 in");  
  17.         [NSThread sleepForTimeInterval:3.f];  
  18.         NSLog(@"1 out");  
  19.     });  
  20.   
  21.     dispatch_async(queue2, ^{  
  22.         NSLog(@"2 in");  
  23.         [NSThread sleepForTimeInterval:2.f];  
  24.         NSLog(@"2 out");  
  25.     });  
  26.     dispatch_async(queue3, ^{  
  27.         NSLog(@"3 in");  
  28.         [NSThread sleepForTimeInterval:1.f];  
  29.         NSLog(@"3 out");  
  30.     });  
  31.       
  32.       
  33.       
  34. }  
  35.   
  36. 输出  
  37.  1 in  
  38.  1 out  
  39.  2 in  
  40.  2 out  
  41.  3 in  
  42.  3 out  

 

 


0 0
原创粉丝点击