iOS & Swift 공부 - Operation Queue

김영채 (Kevin)·2021년 2월 11일
0

iOS & Swift

목록 보기
76/107
  • 연산(Operation)의 실행을 관리하고 대기열의 동작관리를 하는 Operation Queue
  • 스위프트에서 Queue 를 볼 때마다 Main Queue Operation (ex. UI updates) 인지, 아니면 Background Queue Operation (ex. Network call in the background - asynchronous task) 인지 판단해야 함.
import UIKit

let mainQueue = OperationQueue.main

// In the main queue, you should update your UI
  • Main Queue 에 작업을 추가시키는 법은?
mainQueue.addOperation

→ addOperation 다음에 실행할 수 있는 종류의 코드가 많음.

ex.

mainQueue.addOperation(_ op: Operation) 
// Operation 을 pass 하는 것임

let operation = Operation()
mainQueue.addOperation(operation)

// 이런 식으로 main queue 에 작업을 추가할 수 있음

예시:

  • 유저 아이디를 먼저 가져오고, 그 다음에 해당 유저 아이디에 맞는 프로필 이미지를 불러오고 싶다면?
let customQueue = OperationQueue()

let fetchIDOperation = Operation()

let fetchPhotoWithIDOperation = Operation()
fetchPhotoWithIDOperation.addDependency(fetchIDOperation)

customQueue.addOperation(fetchPhotoWithIDOperation)
// 큐에 fetchPhotoWithIDOperation 을 넣어도 큐는 이 작업이 fetchIDOperation 에 
// dependent 하다는 것을 안다.

→ 핵심은 먼저 유저 아이디를 가져와야 한다는 것이다. addDependency(fetchIDOperation) 의 의미는 곧 Operation Queue 보고 fetchIDOperation 이 완료되기 전에 fetchPhotoWithIDOperation 를 실행시키지 말라는 것이다.

→ 이러한 Dependency 를 추가할 수 있기 때문에 DispatchQueue / Grand Central Dispatch (GCD) 보다 OperationQueue 를 더 선호할 때가 많음

( DispatchQueue 에서도 dependency 추가는 가능하다 사용 자체는 OperationQueue가 더 쉬움 )

States

  • Operation Queue 에 있는 다양한 operation 의 state (상태) 도 확인 가능

예시:

  • 앱 내에서 어떤 network call 을 하는 중인데 User가 뒤로가기를 눌렀다. 그러면 더 이상 network call 을 할 필요가 없기 때문에 cancel () 메서드 호출 가능
fetchPhotoWithIDOperation.cancel()

Queue Customizing

  • Operation Queue 내의 concurrent requests 의 최대 수를 별도 지정 가능
let customQueue = OperationQueue()

customQueue.maxConcurrentOperationCount = 30

→ 만약 customQueue 에 40개의 작업을 추가했다면, 30개의 작업만 동시적으로 (concurrently) 실행이 되며, 나머지 10개는 Queue 에 넣어 미리 추가된 30개의 작업이 하나씩 수행 완료될 때마다 실행이 됨.

참고:

  • 대부분의 앱은 Dispatch Queue 를 사용한다.

왜 ? → 대부분의 로직은 OperationQueue 를 사용할만큼 복잡한 dependency 를 가지고 있지 않다.

→ Operation Queue 는 사실 GCD / Dispatch Queue에 구현이 되어있음

profile
맛있는 iOS 프로그래밍

0개의 댓글