2014-04-16 1 views
5

dispatch_set_target_queue에 소재가 부족하여 도움을 요청했습니다. 감사합니다. 내가dispatch_set_target_queue는 어떻게 작동합니까?

을 설정하면,

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(mySerialDispatchQueue2, mySerialDispatchQueue1); 

후 결과가 설정 한 경우 지금

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(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 기능

  • 변화 큐
  • 의에는 우선 순위가 파견 큐의 계층 구조를 만들 수 있다는 것을 알고.

내 코드에서 결과로 이어지는 두 번째 요점이지만 실제로 구체적인 세부 사항을 알지 못합니다. 누군가 나에게 설명 할 수 있을까?

답변

2

다른 사람에게 목표 대기열을 설정하면 두 대기열의 작업을 모두 첫 번째 경우에 동기화합니다. dispatch_set_target_queue (mySerialDispatchQueue2, mySerialDispatchQueue1); mySerialDispatchQueue1은 대상 큐이므로 mySerialDispatchQueue2에 추가 된 모든 작업도 mySerialDispatchQueue1에서 대기열에 포함됩니다. 그것이 대상 queue.So mySerialDispatchQueue1 이미 두 개의 작업을하므로 다른 하나는 나중에 mySerialDispatchQueue2 큐에서 추가됩니다.

두 번째 경우 : dispatch_set_target_queue (mySerialDispatchQueue1, mySerialDispatchQueue2); 대상 큐가 mySerialDispatchQueue2이므로 시작시 태스크가 없을 때 mySerialDispatchQueue1의 태스크가 mySerialDispatchQueue2에 추가되고 자체 태스크는 대기열에 있습니다. 그래서 이런 식으로 작업이 추가되었습니다.