Introduction of GCD & Operation

박성민·2021년 7월 5일
0

iOS

목록 보기
21/30

Grand Central Dispatch

  • C의 libdispatch의 애플 버젼
  • clousure 단위로 task를 queue에 넣는 것이 목적
  • 가용한 자원에 따라 병렬로 실행 할 수 있다.

Synchronous VS Asynchronous tasks

  • Sync는 실행되고 있는 작업이 끝날 때까지 앱이 대기하고 현재 런루프를 차단합니다.
  • Async는 작업을 실행한 즉시 앱으로 돌아가서 첫번째 작업이 실행되는 동안 다른 작업을 자유롭게 실행 할 수 있습니다.

Serial VS Concurrent queues

  • Serial queue는 single thread에서 동작합니다. 따라서 한번에 하나의 task만 실행됩니다.
  • Concurrent queue는 시스템의 자원이 허용하는 한 여러 쓰레드를 사용할 수 있습니다. 필요에 따라 concurrent queue에서 쓰레드를 생성 및 해제합니다.

Asynchronous doesn't mean concurrent

  • Asynchronous(비동기)라고 해서 task가 동시에 실행 되는 것은 아닙니다. Serial queue 또는 concurrent queue에 task를 제출할 수 있습니다.
  • Sync, Async는 단순히 작업을 실행하는 queue가 다음 작업을 실행하기 위해 현재 작업이 완료될 때까지 기다려야하는지 여부를 나타냅니다.
  • Serial, Concurrent는 queue가 single thread를 사용하는지 multi thread를 사용가능한지 구분됩니다. 3개의 async task를 serial queue에 넣으면 thread가 한개이므로 각 task를 완전히 완료해야 다음 task를 시작할 수 있습니다.

Operations

  • GCD는 백그라운드에서 한 번 실행해야 하는 일반적인 태스크에 적합합니다.
  • 이미지 편집 작업과 같이 재사용 가능한 기능을 구축하는 경우 해당 기능을 클래스에 캡슐화할 수 있는데, Operations를 사용하면 해당 목표를 달성할 수 있습니다.

Operation subclassing

  • GCD에 작업 closure를 제출하는 DispatchQueue처럼 Operations는 OperationQueue에 제출 할 수 있는 fully functioned class입니다.
  • Operations는 클래스이고 변수를 포함할 수 있기 때문에 특정시점에서의 작업 상태를 파악할 수 있습니다.
  • Operations는 다음 상태중 하나로 존재할 수 있습니다.
    • isReady
    • isExecuting
    • isCancelled
    • isFinished
  • GCD와 달리 operation은 기본적으로 sync로 동작합니다. async하게 실행되게 하려면 더 많은 작업이 필요합니다. 사용자가 직접 작업을 실행시킬 수 있지만 sync nature한 특성으로 인해 좋은 생각이 아닙니다. UI성능에 영향을 미치지 않도록 OperationQueue에 제출하여 main thread에서 벗어나야 합니다.

BlockOperation

  • GCD와 비슷하게 간단하게 사용가능한 closure가 필요할 때, DispatchQueue조차 만들고 싶지 않을 때 BlockOperation을 사용할 수 있습니다.
  • BlockOperation은 Operations를 서브클래싱 하고 default global queue에서 하나 이상의 closure의 동시 실행을 관리합니다. 그러나 실제 Operation의 서브클래스가 되면 Operation의 다른 모든 기능을 사용할 수 있습니다.

Note: BlockOperation은 concurrent하게 동작합니다. 따라서 serial하게 실행시키고 싶으면 dispatch queue를 사용해야합니다.

Which should you use?

  • GCD와 Operation을 사용해야하는 명확한 기준은 없습니다. GCD는 실행하고 잊어버릴만한 간단한 task를 좀더 편하게 사용할 수 있고, Operation은 계속 상태를 추적하여 유지 또는 취소해야 할 때 훨씬 많은 기능을 제공합니다.
  • 실행이 필요한 methods 나 chunks of code 로만 작업할 때에는 GCD가 적합하다. 데이터 및 기능을 캡슐화해야하는 객체와 작업할 때는 Operation을 활용할 가능성이 높습니다.
  • 몇몇 개발자들은 operation이 GCD기반으로 만들었고, 애플의 가이드에서 항상 최고 수준의 추상화를 사용하라고하기 때문에 항상 operation을 사용해야 한다고 주장합니다.

출처: Concurrency by Tutorials Multithreading in Swift with GCD and Operations by Scott Grosch

profile
iOS시작~

0개의 댓글