iOS 멀티스레드 GCD의 dispatchgroup
이 글은 디스패치 소개를 통해group 기본 기능, 실례를 통해 디스패치 설명그룹의 사용법.
dispatch_그룹은 GCD(Grand Central Dispatch)의 한 그룹 방법으로 그는 하나의 그룹 개념을 가지고 관련 임무를 한 그룹에 합쳐서 집행할 수 있으며 그룹 내의 모든 임무의 집행 상황을 감청하여 상응하는 처리를 할 수 있다.
dispatch_그룹에는 다음과 같은 몇 가지 방법이 있습니다.
dispatch_group_create
작업 그룹 만들기
dispatch_group_t dispatch_group_create(void);
dispatch_group_async
비동기 작업을 지정한 작업 그룹에 제출하고 지정한 다음에 대기열에서 꺼내서 실행합니다
void dispatch_group_async(dispatch_group_t group,
dispatch_queue_t queue,
dispatch_block_t block);
dispatch_group_wait
또는 dispatch_group_notify
를 통해 퀘스트 그룹 내 퀘스트의 집행 상황을 감청할 수 있음대응하는 작업 그룹에 실행되지 않은 작업 수를 추가하는 데 사용합니다. 한 번 실행하고 실행되지 않은 작업 수를 1로 추가합니다. 실행되지 않은 작업 수가 0일 때
dispatch_group_wait
막힘과 dispatch_group_notify
Block 실행을 해제합니다.void dispatch_group_enter(dispatch_group_t group);
dispatch_group_leave
작업 그룹에서 수행되지 않은 작업 수를 줄이기 위해 한 번, 수행되지 않은 작업 수를 1 빼기
dispatch_group_enter
와 dispatch_group_leave
가 일치해야 한다. 그렇지 않으면 시스템이 그룹 작업이 수행되지 않았다고 생각할 것이다.void dispatch_group_leave(dispatch_group_t group);
dispatch_group_wait
그룹 작업이 완료될 때까지 기다리면 현재 스레드가 막힙니다. 작업 그룹이 실행이 완료되었을 때 현재 스레드가 막힙니다
long dispatch_group_wait(dispatch_group_t group,
dispatch_time_t timeout);
DISPATCH_TIME_FOREVER
로 설정하면 작업 그룹이 실행될 때까지 기다립니다dispatch_group_notify
작업 그룹이 실행될 때 호출되며 현재 라인을 막지 않습니다
void dispatch_group_notify(dispatch_group_t group,
dispatch_queue_t queue,
dispatch_block_t block);
다음 코드는 그룹의 사용 방법을 간단하게 보여 주고 그룹에 비동기 코드를 끼워 넣은 문제점을 테스트합니다
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
NSLog(@"group one start");
dispatch_group_async(group, queue, ^{
dispatch_async(queue, ^{
sleep(1); // 1 ,
NSLog(@"group one finish");
});
});
dispatch_group_notify(group, queue, ^{
NSLog(@"group finished");
});
콘솔 출력
2016-09-25 09:28:28.716 group one start
2016-09-25 09:28:28.717 group finished
2016-09-25 09:28:29.717 group one finish
인쇄 결과에서 알 수 있듯이 그룹에 비동기 임무를 끼워 넣었을 때 그룹은 그룹 내의 비동기 임무가 실행되기를 기다리지 않고
dispatch_group_notify
에 들어왔다. 이것은 dispatch_group_async
에서 비동기 라인을 다시 켰고 비동기 라인은 직접 되돌아왔기 때문에 그룹은 실행이 끝났다고 여겼다.상기 상황에 대해 해결 방안은
dispatch_group_enter
과 dispatch_group_leave
방법을 사용하여 그룹 내 임무가 언제 진정으로 끝날지 알려주는 것이다.코드는 다음과 같다.dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
NSLog(@"group one start");
dispatch_group_enter(group);
dispatch_async(queue, ^{
sleep(1); // 1 ,
NSLog(@"group one finish");
dispatch_group_leave(group);
});
dispatch_group_notify(group, queue, ^{
NSLog(@"group finished");
});
콘솔 출력
2016-09-25 09:34:07.672 group one start
2016-09-25 09:34:08.677 group one finish
2016-09-25 09:34:08.678 group finished
상기 코드는
dispatch_group_enter
를 통해 그룹에 하나의 임무가 시작되고 실행되지 않은 임무의 수가 1을 더해진다는 것을 알린다. 비동기 스레드 임무가 실행되었을 때 dispatch_group_leave
를 통해 그룹에 하나의 임무가 끝났고 실행되지 않은 임무의 수가 1을 줄인다. 실행되지 않은 임무의 수가 0일 때 그룹은 그룹 내 임무가 모두 끝났다고 생각한다(이것은 GCD의 신호량과 메커니즘이 비슷하다).이럴 때만 리셋dispatch_group_notify
중의 Block.예제 데모
나는 인터넷에서 요청한 두 장의 사진을 한 장의 사진으로 조립하여 보여주는 간단한 데모를 만들었다.이 데모는 디스패치 사용그룹 방법은 두 장의 그림을 모두 완성한 후에 그것을 한 장의 그림으로 조립하여 보여주는 것이다.관심 있는 어린이 신발은 볼 수 있어요~
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.