GCD 학습 의--Dispatch Group

4256 단어 iosDispatchgroupgcd
디 스 패 치 그룹 은 디 스 패 치 큐 에 추 가 된 여러 처리 가 모두 끝 난 뒤 종료 처 리 를 수행 하려 는 경우 가 종종 발생 한다.시리 얼 디 스 패 치 큐 하나만 사용 할 때 이 시리 얼 디 스 패 치 큐 에 실행 하고 자 하 는 처 리 를 모두 추가 하고 마지막 에 추가 로 마무리 하면 된다.그러나 Concurrent Dispatch Queue 를 사용 할 때 나 여러 개의 Dispatch Queue 를 동시에 사용 할 때 소스 코드 는 상당히 복잡 해진 다.이 경우 Dispatch Group 을 사용 합 니 다.다음 소스 코드 와 같이 글로벌 디 스 패 치 큐 에 Block 3 개 를 추가 합 니 다.이 Block 들 은 모두 실행 되면 Main Dispatch Queue 에서 처리 용 Block 을 끝 냅 니 다.
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIOROTY_DEFAULT,0);
dispatch_group_t group = dispatch_group_create();

dispatch_group_async(group,queue,^{NSLog(@"blk0");p});
dispatch_group_async(group,queue,^{NSLog(@"blk1");p});
dispatch_group_async(group,queue,^{NSLog(@"blk2");p});

dispatch_group_notify(group,dispatch_get_main_queue(),^{NSLog(@"done");});
dispatch_release(group);

실행 결 과 는:
blk1
blk2
blk0
done

Global Dispatch Queue 즉 Concurrent Dispatch Queue 에 추가 처리 하고 여러 스 레 드 를 병행 하기 때문에 추가 처리 의 실행 순서 가 정 해 지지 않 습 니 다.실행 시 변화 가 발생 하지만 이 실행 결과 의 done 은 반드시 마지막 으로 출력 됩 니 다.어떤 디 스 패 치 큐 에 추가 처리 하 든 디 스 패 치 그룹 을 사용 하면 이 처리 가 끝 나 는 것 을 감시 할 수 있 습 니 다.모든 처리 가 끝 난 것 을 감지 하면 끝 난 처 리 를 Dispatch Queue 에 추가 할 수 있 습 니 다.디 스 패 치 그룹 을 사용 하 는 이유 다.우선 발송group_create 함수 생 성의 dispatchgroup_t 형식의 Dispatch Group.파견group_create 함수 명 에 포 함 된 create 에 따 르 면 이 Dispatch Group 은 Dispatch Queue 와 같 으 며 사용 종료 후 dispatch 를 통과 해 야 합 니 다.release 함수 방출.dispatch_group_async 함수 와 dispatchasync 함수 가 같 습 니 다.지정 한 Dispatch Queue 에 Block 을 추가 합 니 다.와 dispatchasync 함 수 는 생 성 된 Dispatch Group 을 첫 번 째 인자 로 지정 합 니 다.지정 한 Block 은 지정 한 Dispatch Group 에 속 합 니 다.또한,dispatch Queue 에 Block 을 추가 할 때 와 마찬가지 로 Blocks 는 dispatch 를 통 해retain 함수 가 Dispatch Group 을 가지 고 있어 서 이 Block 은 Dispatch Group 에 속 합 니 다.이렇게 Block 실행 이 끝나 면 이 Block 은 dispatch 를 통 해release 함수 가 가지 고 있 는 Dispatch Group 을 풀 어 줍 니 다.Dispatch Group 사용 이 끝나 면 해당 Dispatch Group 에 속 하 는 Block 을 고려 하지 않 고 즉시 dispatchrelease 함 수 를 풀 면 됩 니 다.Dispatch Group 에 추 가 된 처리 가 모두 실 행 될 때 이 소스 코드 에 사 용 된 dispatchgroup_notify 함 수 는 실 행 된 Block 을 Dispatch Queue 에 추가 하고 첫 번 째 인 자 를 감시 할 Dispatch Group 으로 지정 합 니 다.이 디 스 패 치 그룹 에 추 가 된 모든 처리 가 끝 날 때 세 번 째 인자 인 Block 을 두 번 째 인자 인 디 스 패 치 큐 에 추가 합 니 다.dispatchgroup_notify 함수 에서 어떤 디 스 패 치 큐 를 만 들 든 디 스 패 치 그룹 에 속 하 는 모든 처 리 는 추가 로 지정 한 Block 에서 실 행 됩 니 다.또한,Dispatch Group 에서 도 dispatch 를 사용 할 수 있 습 니 다.group_wait 함 수 는 모든 처리 가 끝 날 때 까지 만 기 다 립 니 다.
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIOROTY_DEFAULT,0);
dispatch_group_t group = dispatch_group_create();

dispatch_group_async(group,queue,^{NSLog(@"blk0");p});
dispatch_group_async(group,queue,^{NSLog(@"blk1");p});
dispatch_group_async(group,queue,^{NSLog(@"blk2");p});

dispatch_group_wait(group,DISPATCH_TIME_FOREVER);
dispatch_release(group);

dispatch_group_wait 함수 의 두 번 째 매개 변 수 는 대기 시간(시간 초과)으로 지정 되 어 있 습 니 다.dispatch 에 속 합 니 다.time_t 형식의 값.이 소스 코드 는 DISPATCH 를 사용 합 니 다.TIME_FOREVER 는 영원한 기다 림 을 의미한다.디 스 패 치 큐 에 속 하 는 처리 가 완료 되 지 않 은 경우 계속 대기 하 며,도중에 취소 할 수 없습니다.

좋은 웹페이지 즐겨찾기