2016-06-19 4 views
0

경합 조건/교착 상태 또는 잘못된 실행으로 이어질 수있는 경우 다른 그룹 내에 디스패치 그룹을 사용할 때의 단점에 대한 조언/검토가 필요했습니다.다른 그룹의 디스패치 그룹 사용

1) 다른 그룹의 범위 안에 dispatch_group_enter이 있습니까? 그런 연습을 한 후에 나는 애플로부터 모범을 ​​찾을 수 없었다. secondCall이 firstCall 후에 일어날 필요가 있다는 것을 기억하십시오. 의존성이 있습니다. 생각?

2) firstCall 결과의 결과에 따라 thirdCall을 실행하는 좋은 설계는 무엇입니까? 그러나 완료에 대한 불가지론자 처리기 타이밍은 나중에 발생할 수 있으며 completionHandler이 완료 될 때까지 기다릴 필요가 없습니다. 파견 그룹의

-(void)someMethod:(void (^)(NSError *error))completionHandler { 

    dispatch_group_t serviceGroup = dispatch_group_create(); 

    dispatch_group_enter(serviceGroup); 
    __typeof__(self) __weak weakSelf = self; 
    [self.obj firstCall completion:^(NSError *firstError) { 
     __typeof__(self) strongSelf = weakSelf; 

     // Second Call 
     if (!firstError.code) { 
      dispatch_group_enter(serviceGroup); 
      [strongSelf.obj secondCall completion:^(void) { 
       dispatch_group_leave(serviceGroup); 
      }]; 
     } 

     // Third call 
     if (!firstError.code) { 
      [strongSelf executeThirdCall]; 
     } 

     dispatch_group_leave(serviceGroup); 
    }]; // Closing block for first call. 

    dispatch_group_notify(serviceGroup, dispatch_get_main_queue(), ^{ 
     if (completionHandler) { 
      completionHandler(error); 
     } 
    }); 
} 

일부 고전적인 예이 answer에서 찾을 수 있습니다 -

여기에 3 개 통화를 통합 완료 핸들러의 간단한 예입니다.

답변

0

이 코드와 관련된 문제는 생각할 수 없습니다.

그러나이 예에서는 파견 그룹이 필요하지 않은 것으로 확신합니다. 세 가지 요청을 실행 중입니다. 요청 2와 요청 3은 모두 요청 1에 따라 달라집니다. 요청 2가 완료되면 함수의 completionHandler를 호출해야합니다. 요청 2의 완료 처리기로 처리 할 수 ​​없습니까?

+0

귀하의 이해가 정확합니다. 하지만 마지막 줄이 분명하지 않니?! "요청 2의 완료 처리기로 처리 할 수 ​​없습니까?"- 전체 처리 방법은 완료 처리기입니다. 종속성이있는 GCD 발송 그룹의 고전적인 예입니다. – raurora

관련 문제