ProgramingTip

GCD에서 "전역 면역"과 "주 면역"의 차이점은 무엇입니까?

bestdevel 2020. 12. 29. 07:44
반응형

GCD에서 "전역 면역"과 "주 면역"의 차이점은 무엇입니까?


다른 방법 중에는 다음 두 가지 방법으로 많은 수 있습니다 GCD.

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_get_main_queue();

내가 틀리지 않았다면 "메인 큐"는 메인 실행하는 실행되고 "콜백"블록에 좋습니다.

이것은 "글로벌 큐"가 프로그램에서 실행되는 것 의미 의미입니까?


메인 큐는 실제로 당신이 말한 것처럼 메인에서 실행됩니다.

전역 대기열은 동시 대기열이며 dispatch_get_global_queue의 기본 페이지에 있습니다.

dispatch_queue_create ()로 할당 된 기본 대기열과 달리 전역 연속되는 순서를 사용할 수있는 즉시 블록을 예약합니다. 글로벌 동시 대기열은 세 가지 우선 순위 대역을 나타냅니다.

       •   DISPATCH_QUEUE_PRIORITY_HIGH
       •   DISPATCH_QUEUE_PRIORITY_DEFAULT
       •   DISPATCH_QUEUE_PRIORITY_LOW

우선 순위가 높은 글로벌 큐에 출시 된 블록은 기본 또는 낮은 우선 순위 글로벌 큐에 출시 된 블록보다 먼저 호출됩니다. 낮은 우선 순위 글로벌 큐에 호출 된 블록은 기본 또는 높은 우선 순위 큐에 보류중인 블록이없는 경우에만 호출됩니다.

따라서 사용 가능하게 될 때 음성에서 실행되는 내용입니다. "FIFO"라고 주문이 보장되지 않습니다.


5 개의 많은 백그라운드 (4 개의 백그라운드, 1 개의 개의 기본)은 모두 다른 똑같은 순위 ( )를 습니다.-[NSThread threadPriority]

                            -main- : 0.758065
      DISPATCH_QUEUE_PRIORITY_HIGH : 0.532258
   DISPATCH_QUEUE_PRIORITY_DEFAULT : 0.500000
       DISPATCH_QUEUE_PRIORITY_LOW : 0.467742
DISPATCH_QUEUE_PRIORITY_BACKGROUND : 0.000000

(iPod 4 세대 및 MacBook Pro의 시뮬레이터에서 테스트 됨)


예. 기기에서 다음과 같은 코드를 실행하여 테스트 할 수 있습니다.

dispatch_async(
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"Block 1a");
            NSAssert(![NSThread isMainThread], @"Wrong thread!");
            NSLog(@"Block 1b");
        });
dispatch_async(
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            dispatch_async(dispatch_get_main_queue(), ^{
                    NSLog(@"Block 2a");
                    NSAssert([NSThread isMainThread], @"Wrong thread!");
                    NSLog(@"Block 2b");
                });
        });

일련의 연속 대기열

serial또는 일 수 있습니다 concurrent.

Serial 또는 연속적으로, 내면의 클로저가 iOS에 의해 내고 끝날 때까지 작동 한 다음 다른 표현 요소를 끌어 오는 식입니다.

Concurrent 또는 다중 언어, 시스템이 많은 것에서 실행을 시작합니다.

여기에 이미지 설명 입력

동기 대

GCD를 사용하면 synchronously또는 asynchronously.

synchronous함수가 반환 호출자에게 제어 작업 완료. 블록은 작업까지 큐 대기가 완료됩니다. 를 호출하여 작업 단위를 동기식으로 예약 할 수 있습니다 DispatchQueue.sync(execute:).

여기에 이미지 설명 입력

asynchronous기능을 시작하는 작업을 주문하지만가 완료 될 때까지 기다리지 않고 즉시 반환합니다. 따라서 비동기 함수는 현재 실행 스레드가 다음 함수로 진행되는 것을 차단하지 않습니다. 를 호출하여 작업 단위를 비동기 적으로 예약 할 수 있습니다 DispatchQueue.async(execute:).

여기에 이미지 설명 입력

글로벌 디스패치 대기열

GCD 세 가지 주요 유형의 대기열을 제공합니다.

Main queue다음에 실행 main thread하고있다 serial queue. 동시 대기열의 작업에서 작업을 완료 한 후 UI를 업데이트하는 일반적인 선택입니다.

Global queues: concurrent queues전체 시스템에서 공유합니다. 이것은 백그라운드에서 비 UI 작업을 수행하는 일반적인 선택입니다. 서로 다른 우선 순위와 이러한 네 개의 큐가 있습니다 : high, default, low,와 background. 백그라운드 우선 순위 대기열은 가장 낮은 우선 순위를 가지며 부정적인 시스템 영향을 최소화하기 위해 모든 I / O 활동에서 조절됩니다. 전역 동시 대기열을 설정할 때 우선 순위를 직접 지정하지 않습니다. 대신 Quality of Service (QoS)클래스 속성 을 지정 합니다.

  • User-interactive-좋은 사용자 경험을 제공하기 위해 즉시 수행해야하는 작업을 나타냅니다. 이것은 메인 스레드에서 실행 되어야 합니다 .

  • User-initiated- 는 UI에서 시작되고 비동기 적으로 수행 할 수있는 작업을 나타냅니다 . 사용자가 즉각적인 결과를 기다리고있을 때와 사용자 상호 작용을 계속하는 데 필요한 작업에 사용해야합니다.

  • Utility-일반적으로 사용자에게 표시되는 진행률 표시기가있는 장기 실행 작업을 나타냅니다. 위해 사용 계산 , I / O , 네트워크 , 연속 데이터 피드 와 유사한 작업. 이 클래스는 에너지 효율적으로 설계되었습니다.

  • Background-사용자가 직접 알지 못하는 작업을 나타냅니다. 사용자 상호 작용이 필요하지 않고 시간에 민감하지 않은 프리 페치, 유지 관리 및 기타 작업에 사용합니다.

Custom queues: 이러한 대기열의 요청은 실제로 전역 대기열 중 하나에서 끝납니다. 생성 할 수있는 대기열serial or concurrent

일반 단어 대 동기

여기 , 여기 , 여기 에서 자세히 알아 보세요.


글로벌 디스패치 대기열 :

  1. 동시 시퀀스의 작업이 동시에 실행 됨 [백그라운드 콘텐츠]
  2. 작업은 순서대로 추가됩니다.

기본 디스패치 대기열 :

  1. 애플리케이션의 메인 애플리케이션에서 작업을 실행하는 사용 가능한 함수입니다.
  2. 일반적으로 일부 백그라운드 처리가 완료되고 사용자 인터페이스를 업데이트 할 때 백그라운드 큐에서 호출해야합니다.

참조 URL : https://stackoverflow.com/questions/9602042/whats-the-difference-between-the-global-queue-and-the-main-queue-in-gcd

반응형