[iOS] GCD (2) -GCD(Grand Central Dispatch) vs. Operation

전성훈·2023년 10월 31일
0

iOS/Concurrency

목록 보기
2/11
post-thumbnail

주제: GCD vs. Operation


서론

  • app concurrent를 만들 때 사용할 수 있는 두 개의 API가 있다. 이는 Grand Central Dispatch(GCD), Operations이다.
  • 이 두 개는 서로 경합되는 기술이 아닐뿐더러 전혀 다른 기술이 아니다.
  • Operations은 GCD를 기반으로 구현되어있다.

Grand Central Dispatch

  • Grand Central Dispatch(GCD)는 C의 libdispatch 라이브러리의 Apple에서 구현한 것이다. CGD는 자원의 가용성에 따라 병렬로 실행될 수 있는 메서드나 클로저와 같은 작업을 큐잉하고, 그런 다음 이러한 작업을 가용한 프로세서 코어에 실행한다.
  • GCD는 Thread를 사용하지만, Thread를 직접 관리할 필요가 없다. 전통적인 스레드를 생성하는 데에는 수백 개의 명령어가 필요한 반면, GCD는 구현에 단 15개의 명령어만 필요하다고 언급했었다(2009 wwdc)
  • GCD가 관리하는 모든 작업은 GCD-FIFO 큐에 넣어진다. 큐에 제출하는 각 작업은 시스템에서 완전히 관리되는 스레드 풀에서 실행된다.
  • 어떤 스레드에서 작업이 실행되는지에 대해서는 보장할 수 없다.

Operation

  • Operation은 GCD에서 여러가지 기능을 더한 것이며, 복잡한 일을 담당하고 데이터와 기능을 캡슐화한 객체이다. 취소 / 순서지정 / 일시중지 등의 기능을 사용할 수 있다.
  • GCD는 백그라운드에서 한 번 실행되어야 하는 일반적인 작업에 적합하다. 예를들면, 이미지 편집 작업과 같은 작업이다. 이러한 기능은 클래스에 캡슐화하는 것이 좋은데, Operatio이 이를 SubClass화 하여 위와 같은 작업을 할 수 있다.
  • Operation은 클로저를 DispatchQueue에 제출하는 것과 마찬가지로 OperationQueue에 제출할 수 있는 완전한 기능을 갖춘 클래스이다. 클래스이므로 변수를 포함할 수 있어서 작업의 상태를 언제든지 파악할 수 있다.
  • Operation은 다음 중 하나의 상태로 존재할 수 있다.
    • isReady
    • isExecuting
    • isCancelled
    • isFinished
  • GCD와 다르게, Operation은 기본적으로 동기적으로 실행되며, 비동기적으로 실행하기 위해서는 추가 작업이 필요하다. 이는 작업을 OperationQueue에 제출하여 메인 스레드에서 떼어내는 것이다.
  • GCD와 다르게 비동기 작업을 Operation으로 래핑하고 각 작업간에 종속성을 지정하는 것과 같은 일반적인 요구 사항을 더욱 세밀하게 제어할 수 있다.
  • Operation을 많이 사용하는 앱에서도 단순한 GCD 스타일의 클로저가 필요한 경우가 있는데, 이는 DispatchQueue를 생성할 필요 없이 BlockOperation 클래스를 사용하면 된다.
  • BlockOperation은 Operation을 서브 클래스화하고, 하나 이상의 클로저를 기본 글로벌 큐(default global queue)에서 동시에 실행된다. 그러나 실제 Operation의 서브 클래스이기 때문에 Operation의 모든 다른 가능을 활용할 수 있다.
class MyOperation: Operation { 
	override func main() { 
		if isCancelled { 
			return 
		}
		// 작업수행
	}
}

let queue = OperationQueue() 
let operation = MyOperation() 
queue.addOperation(operation)
  • 위 예시에서는 Operation을 서브 클래스로 구현한 MyOperation 클래스를 정의하고, main() 메서드에서 실제 작업을 수행한다. main() 메서드는 작업을 실행할 때 호출되는 메서드이다. 만약 작업이 이미 취소된 경우, 메서드는 그대로 종료된다.
  • 그리고 OperationQueue를 생성한 후 addOperation() 메서드를 사용하여 MyOperation 객체를 큐에 추가가한다. 큐는 작업을 실행할 스레드를 자동으로 관리한다.
  • 이렇게 작성된 MyOperation 클래스는 isReady, isExecuting, isCancelled, isFinished 등의 작업 상태와 관련된 프로퍼티를 제공한다. OperationQueue에서는 이러한 프로퍼티를 사용하여 작업의 상태를 추적할 수 있다.
  • 작업을 취소하려면, Operation 클래스의 cancel() 메서드를 호출하면 된다.

출처(참고문헌)

제가 학습한 내용을 요약하여 정리한 것입니다. 내용에 오류가 있을 수 있으며, 어떠한 피드백도 감사히 받겠습니다.

감사합니다.

0개의 댓글