경합 조건/교착 상태 또는 잘못된 실행으로 이어질 수있는 경우 다른 그룹 내에 디스패치 그룹을 사용할 때의 단점에 대한 조언/검토가 필요했습니다.다른 그룹의 디스패치 그룹 사용
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 개 통화를 통합 완료 핸들러의 간단한 예입니다.
귀하의 이해가 정확합니다. 하지만 마지막 줄이 분명하지 않니?! "요청 2의 완료 처리기로 처리 할 수 없습니까?"- 전체 처리 방법은 완료 처리기입니다. 종속성이있는 GCD 발송 그룹의 고전적인 예입니다. – raurora