https://www.raywenderlich.com/5370-grand-central-dispatch-tutorial-for-swift-4-part-1-2

이 스위프트 시리즈의 동시성의 연속이다. 기본 사항을 이해하려면 파트 1 과 파트 2 를 참조하십시오

이 부분에서는 다음 주제를 다룰 것입니다

  1. 작업이란 무엇이며 수명 상태
  2. 작업을 실행하기위한 블록 만들기,작업 및 사용자 지정 작업 비동기
  3. 작업을 취소하는 방법
  4. 작업 큐 란 무엇입니까
  5. 작업 큐에 작업을 추가하는 방법
  6. 작업 간의 종속성을 만드는 방법
  7. 작업 큐를 사용한 디스패치 그룹 구현

작업은 비동기적으로 수행하려는 작업을 캡슐화하는 객체 지향 방식. 작업 객체는 응용 프로그램에서 수행할 작업을 캡슐화하는 데 사용하는Operation or NSOperation 클래스(기본 프레임워크에서)의 인스턴스입니다.

작업 클래스 자체는 유용한 작업을 수행하기 위해 서브클래스되어야 하는 추상 기본 클래스입니다. 추상적임에도 불구하고 이 클래스는 자체 하위 클래스에서 수행해야 하는 작업의 양을 최소화하기 위해 상당한 양의 인프라를 제공합니다. 또한 기초 프레임워크에서는 기존 코드와 함께 있는 그대로 사용할 수 있는 두 개의 구체적인 하위 클래스를 제공합니다.

작업 상태

작업에 수명 주기를 나타내는 상태 머신이 있습니다. 이 수명 주기의 여러 부분에서 발생할 수 있는 몇 가지 상태가 있습니다:

  • instantiated이되면isReady상태로 전환됩니다.
  • start메서드를 호출하면isExecuting상태로 전환됩니다.
  • 작업finished,그것은isFinished
  • 작업이 진행 중이고 호출 할 때cancel,다음은isFinished상태로 이동하기 전에isCancelled상태로 전환됩니다

작업을 만드는 주로 세 가지 방법이 있습니다

블록 작업(콘크리트 클래스)

하나 이상의 블록 개체를 동시에 실행하기 위해 있는 그대로 사용하는 클래스입니다. 둘 이상의 블록을 실행할 수 있기 때문에 블록 작업 개체는 그룹 의미 체계를 사용하여 작동합니다; 연결된 모든 블록의 실행이 완료된 경우에만 작업 자체가 완료된 것으로 간주됩니다.. 블록 작업에서 작업 종속성,케이보,알림 및 취소를 활용할 수 있습니다.

그림 1 과 같이 이 코드async을 실행했는데,이 코드는 즉시 반환되지만 나쁜 소식은operation.start() 이 주 스레드

작업 객체는 기본적으로 동기식으로 실행됩니다.

그림 1

도대체 동기 방식이며 하나 이상의 블록 객체를 동시에 실행합니다.

그림 1.0.1 에서 볼 수 있듯이 작업/블록 자체가 동시에 실행 블록 작업에 추가하지만 블록 실행 동기 방식은 시작이 호출되는 스레드를 차단 의미 우리의 경우는 주 스레드입니다

그림 1.0.1

우리가 다른 스레드에 시작 방법을 호출하기 때문에 그림 그림 1.0.2 에 도시 된 바와 같이,그 스레드를 차단합니다

그림 1.0.2

그림 그림 1.0.3 과 같이 모든 동시 블록이 실행될 때 호출되는 완료 블록을 추가 할 수 있습니다

그림 1.0.3

그림 1 과 같이 블록 작업을 동시에

실행합니다.1 우리는 배경 스레드에start()메서드를 호출하기 때문에 그것은 스레드에서 자신의 작업을 수행합니다. 이 작업 큐를 사용하여이 작업을 수행 할 수있는 멋진 방법이며,우리는 나중에 볼 수 있습니다.

그림 1.1

구체적인 클래스는 다음과 같습니다.)

응용 프로그램의 개체 및 선택기를 기반으로 작업 개체를 만드는 데 있는 그대로 사용하는 클래스입니다.스위프트에서는 사용할 수 없지만NSInvocationOperation을 만들 수 있습니다.

https://developer.apple.com/library/archive/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationObjects/OperationObjects.html#//apple_ref/doc/uid/TP40008091-CH101-SW6

3. 사용자 지정 작업

서브클래싱Operation 을 사용하면 작업을 실행하고 상태를 보고하는 기본 방법을 변경할 수 있는 기능을 포함하여 자체 작업의 구현을 완벽하게 제어할 수 있습니다.

그림 2 와 같이Operation기본 클래스에서 하위 클래스로 사용자 지정 작업을 만들고main메서드를 재정의합니다. 당신이 서브 클래스를 할 때 당신은main방법에 당신의 작업을 넣습니다. 우리는 비 동시 사용자 지정 작업을 구현했으며,이 경우 주 스레드를 차단했습니다

그림 2

작업을 수동으로 실행하려는 경우에도 작업을 비동기적으로 실행하려면 해당 작업을 수행할 수 있도록 적절한 조치를 취해야 합니다. 작업 개체를 동시 작업으로 정의하여 이 작업을 수행합니다.

그림 3 과 같이

  1. 생성 된 서브 클래스MyConcurrentQueue작업을 동시에 수행하기 위해 다음 단계를 수행했습니다. 오타: 이름은MyConcurrentOperations
  2. 호출start()메서드 호출main()메서드 배경 스레드에
  3. 기본 메서드에 우리는 우리의 작업을 정의 하 고 우리가 수용 주의 해야 할 한 가지 취소 사례 뿐만 아니라
  4. 호출cancel사용자 지정 작업에isCancelled상태로 전환 하 고 루프를 중단 하 고 그림 3 에서와 같이 그것은 단지 39487 항목을 인쇄 합니다.

그림 3

작업 대기열

  1. 작업 대기열은 코코아의 상위 수준 추상화입니다. 작업 큐 당신은 작업의 실제 전력을 볼 수 있습니다,대신 작업을 직접 시작,당신은 다음 예약 및 실행을 처리 작업 큐에 제공.
  2. 작업 큐는 비동기적으로 수행할 작업을 캡슐화하는 개체 지향 방법입니다.
  3. operation queueoperations(작업/작업)을 추가하고 두 가지 방법을 사용하여 작업을 만드는 방법에 대해 논의했습니다.

작업 추가

그림 4 와 같이 두 개의 작업(블록 사용)을 만들어 작업 대기열에 추가했습니다. 작업 대기열은 일부 백그라운드 스레드에서 두 작업을 모두 시작하고 실행했습니다. 사용자 지정 스레드에서start()메서드를 호출 할 필요가 없습니다. 우리는 작업 큐에 작업을 추가 할 때 즉시 준비가로 실행

그림 4

그림 5 에서와 같이 우리는 직렬로 작업을 실행하거나 당신은 우리가 작업 큐를 사용하여 직렬 큐를 구현 말할 수 있습니다 내 부분을 참조하십시오 1 당신은 설정하여 직렬 큐가 무엇인지 모르는 경우maxConcurrentOperationCount = 1

maxConcurrentOperationCount →동시에 실행할 수 있는 대기 중인 작업의 최대 수입니다. 기본값은-1 입니다.

그림 5

maxConcurrentOperationCount=2 를 설정하여 동시 대기열을 만들었으며 이제 그림과 같이 작업이 동시에 실행됩니다 6

그림 6

작업 종속성

그림 7 과 같이 두 작업 사이에 종속성을 추가하여 직렬 큐를 다시 만들었습니다. 우리는 두 개의 블록 작업을 만들었고 우리는 작업 2 가 호출하여 완료 될 때까지 작업 1 을 시작하지 말 것을 말하고 있습니다blockOperations1.addDependency(blockOperations2)

그림 7

작업 큐를 사용하여 디스패치 그룹 구현

파트 2 에서는 하나 이상의 작업 실행이 완료 될 때까지 스레드를 차단하는 데 사용됩니다. 그림 8 과 같이 종속성을 사용하여 작업 큐를 사용하여 동일한 동작을 구현했습니다. 이 기능은 지정된 모든 작업이 완료될 때까지 진행하지 못할 경우 매우 유용합니다.

그림 8 에 도시 된 바와 같이 우리는 세 가지 작업을 가지고 우리는 동시에 실행하고 싶었 모든 작업이 완료되면 우리는 모든 작업이 완료되었음을 나타 내기 위해 몇 가지 방법을 호출해야하고 우리가 무슨 짓을했는지

  1. 작업 큐를 생성
  2. 작업을 수행 할 세 개의 블록 작업을 생성
  3. 세 가지 작업이 완료 될 때 트리거 완료 블록 작업(블록 800>
  4. blockOperations4blockOperations1,blockOperations2blockOperations3에 종속되어 있으므로 세 가지 작업이 모두 완료되면 블록 작업 4 가 실행됩니다
  5. waitUntilFinished → 작업 객체가 작업을 완료 할 때까지 현재 스레드의 실행을 차단합니다.주 스레드는 현재 스레드를 차단하고 싶지 않기 때문에 거짓
  6. 이 코드를 실행하고”모든 작업이 완료되었습니다”는 작업 1,작업 2 및 작업 3 이 완료되면 인쇄됩니다

그림 8

그림 9 에서 볼 수 있듯이waitUntilFinished = true. 을 설정하여 주 스레드를 차단하므로 질문이 도움이 될 때 다음 섹션에서 답을 얻을 수 있습니다

그림 9

그림 10 에서 볼 수 있듯이 우리는 종속성을 사용하지 않고 작업 큐를 사용하여 디스패치 그룹 동작을 구현했습니다.waitUntilFinished 기능을 적절하게 사용했습니다. 백그라운드 스레드에있는 경우이 스레드를 차단하여이 동작을 달성 할 수 있습니다. 의도적으로DispatchQueue.global().async메서드를 사용하여 백그라운드 스레드로 전환했습니다.이 코드를 이해하려면 파트 1 참조

우리는 작업 대기열에서 작업 1,작업 2 및 작업 3 을 실행하고 이러한 동시 작업이 실행을 완료 할 때까지 현재 스레드를 차단합니다

그림 10

종속성을 지원합니다. 작업 간의 복잡한 종속성을 매우 쉽게 만들 수 있지만 달성 할 수는 있지만 많은 작업을 수행해야합니다.

  • 이는 작업 또는 작업 큐의 상태를 모니터링하려는 경우 또 다른 중요한 이점입니다.
  • 작업을 일시 중지,재개 및 취소할 수 있습니다. 그랜드 센트럴 디스패치를 사용하여 작업을 디스패치하면 더 이상 해당 작업의 실행에 대한 제어 또는 통찰력이 없습니다. 따라서 개발자는 작업의 수명 주기를 제어할 수 있습니다. 예를 들어 동시에 실행할 수 있는 대기 중인 작업의 최대 수를 지정할 수 있습니다. 이렇게 하면 동시에 실행되는 작업 수를 쉽게 제어하거나 직렬 작업 큐를 만들 수 있습니다.
  • 다가오는

    다음 부분에서는 사용자 지정 작업

    유용한 링크를 만드는 실제 사용 사례를 살펴 보겠습니다

    · https://developer.apple.com/library/archive/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationObjects/OperationObjects.html#//apple_ref/doc/uid/TP40008091-CH101-SW1

    답글 남기기

    이메일 주소는 공개되지 않습니다.