Ios 调度\u设置\u目标\u队列如何工作?

Ios 调度\u设置\u目标\u队列如何工作?,ios,objective-c,grand-central-dispatch,Ios,Objective C,Grand Central Dispatch,由于调度设置目标队列上缺少资料,我来这里寻求帮助,谢谢 以下是我的测试代码: dispatch_queue_t mySerialDispatchQueue1 = dispatch_queue_create("come.itenyh", NULL); dispatch_queue_t mySerialDispatchQueue2 = dispatch_queue_create("come.itenyh1", NULL); dispatch_set_target_queue(mySerialDis

由于
调度设置目标队列
上缺少资料,我来这里寻求帮助,谢谢

以下是我的测试代码:

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];

}
现在如果我设置

 dispatch_set_target_queue(mySerialDispatchQueue2, mySerialDispatchQueue1);
结果是:

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
相反,如果我

dispatch_set_target_queue(mySerialDispatchQueue1, mySerialDispatchQueue2);
结果是:

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
我知道
dispatch\u set\u target\u queue
功能可以

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

我认为这是导致我的代码中出现结果的第二点,但我不知道具体细节。有人能给我解释一下吗?

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

dispatch_set_target_queue(mySerialDispatchQueue2, mySerialDispatchQueue1);
mySerialDispatchQueue1
是目标队列,因此在
mySerialDispatchQueue2
中添加的所有任务也从
mySerialDispatchQueue1
排队。因为它是目标队列。所以
mySerialDispatchQueue1
已经有两个任务,所以稍后添加队列
mySerialDispatchQueue2
中的另一个任务

在第二种情况下:

dispatch_set_target_queue(mySerialDispatchQueue1, mySerialDispatchQueue2);
您的目标队列是
mySerialDispatchQueue2
,因此在开始时,如果没有任务,则将来自
mySerialDispatchQueue1
的任务添加到
mySerialDispatchQueue2
中,则其自己的任务位于队列中。这样就增加了任务