dispatch_set_target_queue一些理解

来源:互联网 发布:弯尖美工钢笔推荐 编辑:程序博客网 时间:2024/05/22 00:43

发现一个很有意思的方法 dispatch_set_target_queue

他可以改变queue的优先级与目标queue相同

这段代码是搬过来的骂人

dispatch_queue_t mySerialDispatchQueue =dispatch_queue_create("com.example.gcd.MySerialDispatchQueue", NULL);dispatch_queue_t globalDispatchQueueBackground =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);dispatch_set_target_queue(mySerialDispatchQueue, globalDispatchQueueBackground);

下边来看更有意思的,一般都是把一个任务放到一个串行的queue中,如果这个任务被拆分了,被放置到多个串行的queue中,但实际还是需要这个任务同步执行,那么就会有问题,因为多个串行queue之间是并行的。

那该如何是好呢?

这是就可以使用dispatch_set_target_queue了。

如果将多个串行的queue使用dispatch_set_target_queue指定到了同一目标,那么着多个串行queue在目标queue上就是同步执行的,不再是并行执行。


看代码:

[objc] view plain copy
  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. }  


猜想下:因为设置了target,按照上边说的,应该是 1 in 1 out  , 2 in 2 out , 3in 3 out

猜不准怎么办?不发表这篇博客害羞


实际输出:

[objc] view plain copy
  1. 2014-11-13 13:18:05.964 TUPIAN[2701:929511 in  
  2. 2014-11-13 13:18:08.965 TUPIAN[2701:929511 out  
  3. 2014-11-13 13:18:08.966 TUPIAN[2701:929512 in  
  4. 2014-11-13 13:18:10.967 TUPIAN[2701:929512 out  
  5. 2014-11-13 13:18:10.968 TUPIAN[2701:929513 in  
  6. 2014-11-13 13:18:11.969 TUPIAN[2701:929513 out  

总结:dispatch_set_target_queue可以设置queue的优先级,也可以使多个serial queue在目标queue上一次只有一个执行
0 0
原创粉丝点击