dispatch_set_target_queue如何工作?

ite*_*nyh 6 objective-c grand-central-dispatch ios

由于缺乏材料dispatch_set_target_queue,我来这里寻求帮助,谢谢!

这是我的测试代码:

dispatch_queue_t mySerialDispatchQueue1 = dispatch_queue_create("come.itenyh", NULL);
dispatch_queue_t mySerialDispatchQueue2 = dispatch_queue_create("come.itenyh1", NULL);

dispatch_set_target_queue(mySerialDispatchQueue1, mySerialDispatchQueue2);

dispatch_async(mySerialDispatchQueue1, ^{[self task:@"s1"];});

dispatch_async(mySerialDispatchQueue2, ^{[self task:@"p1"];});

dispatch_async(mySerialDispatchQueue1, ^{[self task:@"s2"];});

- (void)task:(NSString *)taskid
{

        NSLog(@"Now executing taskid:%@", taskid);

        [NSThread sleepForTimeInterval:5];

}
Run Code Online (Sandbox Code Playgroud)

现在,如果我设置

 dispatch_set_target_queue(mySerialDispatchQueue2, mySerialDispatchQueue1);
Run Code Online (Sandbox Code Playgroud)

然后结果是:

2014-04-16 22:23:49.581 ITGCDLearning[66758:1303] Now executing taskid:s1
2014-04-16 22:23:54.585 ITGCDLearning[66758:1303] Now executing taskid:s2
2014-04-16 22:23:59.586 ITGCDLearning[66758:1303] Now executing taskid:p1
Run Code Online (Sandbox Code Playgroud)

而相反,如果我设定

dispatch_set_target_queue(mySerialDispatchQueue1, mySerialDispatchQueue2);
Run Code Online (Sandbox Code Playgroud)

然后结果是:

2014-04-16 22:28:37.910 ITGCDLearning[66795:1303] Now executing taskid:s1
2014-04-16 22:28:42.913 ITGCDLearning[66795:1303] Now executing taskid:p1
2014-04-16 22:28:47.915 ITGCDLearning[66795:1303] Now executing taskid:s2
Run Code Online (Sandbox Code Playgroud)

我知道这个dispatch_set_target_queue功能可以

  • 改变队列的优先级
  • 创建调度队列的层次结构.

我认为这是导致我的代码结果的第二点,但并不真正了解具体细节.有人可以向我解释一下吗?

Sau*_*pal 3

根据我的说法,当您将目标队列设置为其他队列时,您正在同步两个队列的任务,因此
在第一种情况下

dispatch_set_target_queue(mySerialDispatchQueue2, mySerialDispatchQueue1);
Run Code Online (Sandbox Code Playgroud)

mySerialDispatchQueue1是目标队列,因此添加的所有任务mySerialDispatchQueue2也从mySerialDispatchQueue1. 由于它是目标队列。所以已经有两个任务,因此稍后添加mySerialDispatchQueue1队列中的另一个任务。mySerialDispatchQueue2

在第二种情况下:

dispatch_set_target_queue(mySerialDispatchQueue1, mySerialDispatchQueue2);
Run Code Online (Sandbox Code Playgroud)

mySerialDispatchQueue2当没有任务时,您的目标队列处于启动状态,然后将任务mySerialDispatchQueue1添加到队列中,mySerialDispatchQueue2然后将其自己的任务放入队列中。这样就添加了任务。