dispatch_set_target_queue如何工作? [英] How does dispatch_set_target_queue work?

查看:125
本文介绍了dispatch_set_target_queue如何工作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Due to the lack of material on dispatch_set_target_queue, I have come here for help, so thanks!

这是我的测试代码:

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_set_target_queue 函数可以


  • 更改队列的优先级

  • 创建调度队列的层次结构。

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

I think it is the second point that leads to the result in my code, but don't really know the specific details. Can someone explain it to me?

推荐答案

根据我的说法,当你将目标队列设置为其他队列时,你正在同步两个任务队列所以在第一种情况下:
dispatch_set_target_queue(mySerialDispatchQueue2,mySerialDispatchQueue1);
mySerialDispatchQueue1是目标队列,因此mySerialDispatchQueue2中添加的所有任务也从mySerialDispatchQueue1中排队。因为它是目标队列。所以mySerialDispatchQueue1已经有两个任务,所以稍后会添加队列mySerialDispatchQueue2中的其他任务。

According to me when you set a target queue to other you are synchronizing the task of both the queue so in first case: dispatch_set_target_queue(mySerialDispatchQueue2, mySerialDispatchQueue1); mySerialDispatchQueue1 is target queue so all the task added in mySerialDispatchQueue2 is also enqueued from the mySerialDispatchQueue1. As it is target queue.So mySerialDispatchQueue1 has already two task so other one from queue mySerialDispatchQueue2 is added later.

在第二个案例中:
dispatch_set_target_queue(mySerialDispatchQueue1,mySerialDispatchQueue2) );
您的目标队列是mySerialDispatchQueue2所以在没有任务的开始时,mySerialDispatchQueue1中的任务被添加到mySerialDispatchQueue2中,然后它自己的任务就在队列中。所以以这种方式增加了任务。

In second Case: dispatch_set_target_queue(mySerialDispatchQueue1, mySerialDispatchQueue2); your target queue is mySerialDispatchQueue2 so in start when there is no task then task from mySerialDispatchQueue1 is added in the mySerialDispatchQueue2 then its own task is in queue. So in this way task has been added.

这篇关于dispatch_set_target_queue如何工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆