iOS에서는 주로 두 가지 방법으로 Multi-threading을 구현합니다.
DispatchQueue.main)와 글로벌 큐(DispatchQueue.global(qos:))를 사용합니다.DispatchQueue.global(qos: .background).async {
// 백그라운드 작업
DispatchQueue.main.async {
// UI 업데이트 작업
}
}
Operation)로 관리합니다.let operationQueue = OperationQueue()
let operation1 = BlockOperation {
// 첫 번째 작업
}
let operation2 = BlockOperation {
// 두 번째 작업 (operation1 완료 후 실행)
}
operation2.addDependency(operation1)
operationQueue.addOperations([operation1, operation2], waitUntilFinished: false)
간단한 비동기 작업은 DispatchQueue, 복잡하고 세밀한 작업 제어가 필요하면 OperationQueue를 사용합니다.
Race Condition이란 여러 스레드가 동시에 데이터에 접근하고 수정하여 데이터의 일관성이 깨지는 현상을 말합니다. 이를 방지하는 방법은 다음과 같습니다.
let serialQueue = DispatchQueue(label: "com.example.serialQueue")
serialQueue.async {
// Race Condition 발생하지 않음
}
let lock = NSLock()
lock.lock()
// 안전한 데이터 접근
lock.unlock()
예시:
DispatchQueue.global().async {
// 비동기 작업
DispatchQueue.main.async {
// 메인 스레드에서 UI 업데이트
self.label.text = "작업 완료"
}
}
이러한 방식으로 항상 UI 관련 작업은 메인 스레드에서 처리하는 것을 권장합니다.