iOS의 동시성(Concurrency)

2025. 1. 24. 22:46iOS

반응형

iOS의 동시성(Concurrency)은 앱이 동시에 여러 작업을 수행하도록 지원하는 기능입니다. 동시성을 사용하면 백그라운드에서 작업을 수행하면서 메인 스레드에서 UI를 원활하게 유지할 수 있습니다. iOS에서 동시성을 구현하는 주요 방식은 다음과 같습니다:


1. GCD (Grand Central Dispatch)

GCD는 작업을 큐에 제출하고 비동기로 실행되도록 하는 저수준 API입니다.

  • 작업 큐 종류
    • Main Queue: UI 업데이트를 위해 사용 (메인 스레드).
    • Global Queues: 백그라운드 작업에 사용 (QoS에 따라 분류).
    • Custom Queues: 특정 작업을 위해 사용자 정의 큐를 생성.
// 백그라운드 작업 
DispatchQueue.global(qos: .background).async { 
	// 비동기 작업 수행 
    let result = doHeavyWork() 
    
    DispatchQueue.main.async { 
    	// UI 업데이트 
        self.updateUI(result) 
    } 
}

2. Operation 및 OperationQueue

Operation은 작업 단위를 정의하고 OperationQueue에서 이를 관리합니다. GCD보다 추상화된 고수준 API로, 작업 간의 의존성을 설정하거나 취소할 수 있습니다.

let operationQueue = OperationQueue() 

let operation1 = BlockOperation { 
	print("Task 1") 
}

let operation2 = BlockOperation { 
	print("Task 2") 
} 

operation2.addDependency(operation1) // Task 2는 Task 1 이후 실행 
operationQueue.addOperations([operation1, operation2], waitUntilFinished: false)

3. Swift Concurrency (async/await)

iOS 13 이상에서 사용할 수 있으며, iOS 15 이상에서는 Structured Concurrency가 도입되었습니다. 이를 통해 코드를 더 간결하고 읽기 쉽게 작성할 수 있습니다.

주요 키워드

  • async: 비동기 함수 정의.
  • await: 비동기 함수 호출.
  • Task: 비동기 컨텍스트에서 작업 실행.
func fetchData() async -> String { 
	// 비동기 작업 수행
    try? await Task.sleep(nanoseconds: 1_000_000_000) // 1초 대기 
    return "Data fetched" 
} 

func loadData() { 
	Task { 
    	let data = await fetchData() 
        print(data) 
    }
}

4. Combine Framework

iOS 13 이상에서 도입된 반응형 프로그래밍 방식으로, 데이터 흐름과 상태 변화를 처리합니다.

import Combine 

var cancellables = Set<AnyCancellable>() 
URLSession.shared.dataTaskPublisher(for: URL(string: "https://example.com")!) 
	.map(\.data) 
    .decode(type: MyModel.self, decoder: JSONDecoder()) 
    .receive(on: DispatchQueue.main) 
    .sink(receiveCompletion: { 
    	completion in print(completion) 
    }, receiveValue: { model in 
    	print(model) 
    }) 
    .store(in: &cancellables)

5. 동시성과 QoS (Quality of Service)

작업의 우선순위를 설정하여 시스템 리소스를 효율적으로 사용할 수 있습니다.

  • User-Interactive: UI와 관련된 작업.
  • User-Initiated: 사용자가 요청한 작업.
  • Utility: 긴 시간 동안 실행되는 작업 (예: 파일 다운로드).
  • Background: 우선순위가 낮은 작업.
DispatchQueue.global(qos: .userInitiated).async { 
	// 높은 우선순위의 백그라운드 작업 
}

비교

방식장점사용 예시

GCD 간단한 API, 낮은 오버헤드 간단한 백그라운드 작업.
OperationQueue 작업 취소, 의존성 설정 지원 복잡한 작업 흐름 관리.
Swift Concurrency 간결하고 직관적인 코드 작성 iOS 15 이상에서 최신 동시성 활용.
Combine 반응형 데이터 흐름 관리 네트워크 요청과 데이터 스트림 처리.

어떤 동시성 방법을 사용할지 정하기 위해 앱의 요구사항, 최소 iOS 버전, 코드 복잡성을 고려하세요.

반응형

'iOS' 카테고리의 다른 글

[iOS] Webview Deep Link/Universal Link  (1) 2025.01.25
[iOS] WKWebView  (1) 2025.01.25
모바일 개발 시 협업의 중요성  (1) 2025.01.21
[QA] QA담당자와 협업하기  (1) 2025.01.21
[기획] 기획자와 협업하기  (1) 2025.01.21