dispatch_set_target_queue如何工作?
由于dispatch_set_target_queue
缺less资料,我来这里寻求帮助,谢谢!
这是我的testing代码:
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
函数可以
- 改变队列的优先级
- 创build调度队列的层次结构。
我认为这是导致我的代码结果的第二点,但不真正知道具体的细节。 有人可以向我解释吗?
根据我当你设置一个目标队列到其他你正在同步队列的任务,所以在第一种情况下:dispatch_set_target_queue(mySerialDispatchQueue2,mySerialDispatchQueue1); mySerialDispatchQueue1是目标队列,因此在mySerialDispatchQueue2中添加的所有任务也都从mySerialDispatchQueue1入队。 因为它是目标队列。所以mySerialDispatchQueue1已经有两个任务,所以稍后添加队列mySerialDispatchQueue2中的另外一个。
在第二种情况下:dispatch_set_target_queue(mySerialDispatchQueue1,mySerialDispatchQueue2); 你的目标队列是mySerialDispatchQueue2,所以在没有任务的时候开始,然后mySerialDispatchQueue1的任务被添加到mySerialDispatchQueue2中,然后它自己的任务在队列中。 所以这样就增加了任务。
- 创build具有相同名称的串行队列的两个对象共享同一个队列
- 在dispatch_semaphore_dispose上的EXC_BAD_INSTRUCTION(code = EXC_I386_INVOP,子码= 0x0)
- GCD和webView死锁
- 在一段时间后显示UIAlertView
- iOS MKMapShapshotter完成块并不总是被调用
- 与GCD同时排队? (iOS 4.2.1)
- GCD,NSThread和performSelector:onThread:问题
- 主线程在viewDidLoad中的一个并发队列上执行dispatch_async,或者在一个方法内部执行
- 我们如何在iOS应用程序转到后台时调度Google Analytics事件?