iOS 멀티스레드 GCD의 dispatchgroup

4287 단어
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);
  • group - 대응하는 퀘스트 그룹, 이후dispatch_group_wait 또는 dispatch_group_notify를 통해 퀘스트 그룹 내 퀘스트의 집행 상황을 감청할 수 있음
  • queue - Block 작업이 실행되는 라인 대기열, 작업 그룹 내의 서로 다른 작업의 대기열이 다를 수 있음
  • Block - 작업을 수행하는 Block
  • dispatch_group_enter
    대응하는 작업 그룹에 실행되지 않은 작업 수를 추가하는 데 사용합니다. 한 번 실행하고 실행되지 않은 작업 수를 1로 추가합니다. 실행되지 않은 작업 수가 0일 때 dispatch_group_wait 막힘과 dispatch_group_notify Block 실행을 해제합니다.
    void dispatch_group_enter(dispatch_group_t group);
    

    dispatch_group_leave
    작업 그룹에서 수행되지 않은 작업 수를 줄이기 위해 한 번, 수행되지 않은 작업 수를 1 빼기dispatch_group_enterdispatch_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);
    
  • group – 대기 작업 그룹
  • timeout-대기 시간 초과(즉 얼마나 기다립니까), 단위는dispatchtime_t.DISPATCH_TIME_FOREVER로 설정하면 작업 그룹이 실행될 때까지 기다립니다
  • .
    dispatch_group_notify
    작업 그룹이 실행될 때 호출되며 현재 라인을 막지 않습니다
    void dispatch_group_notify(dispatch_group_t group,
                               dispatch_queue_t queue, 
                               dispatch_block_t block);
    
  • group - 감청이 필요한 작업 그룹
  • queue - Block 작업이 실행된 스레드 대기열은 이전 그룹이 실행한 스레드 대기열과 무관합니다
  • Block - 작업 그룹이 완료되었을 때 수행해야 하는 작업 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_enterdispatch_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.
    예제 데모
    나는 인터넷에서 요청한 두 장의 사진을 한 장의 사진으로 조립하여 보여주는 간단한 데모를 만들었다.이 데모는 디스패치 사용그룹 방법은 두 장의 그림을 모두 완성한 후에 그것을 한 장의 그림으로 조립하여 보여주는 것이다.관심 있는 어린이 신발은 볼 수 있어요~

    좋은 웹페이지 즐겨찾기