[swift] Swift GCD에서의 동기와 비동기 실행의 차이점

Swift에서 Grand Central Dispatch(GCD)를 사용하여 다중 스레드를 처리할 때, “동기 실행(synchronous execution)”와 “비동기 실행(asynchronous execution)” 사이의 차이를 이해하는 것이 중요합니다. 각 방법은 다른 방식으로 작업을 처리하고 결과를 반환합니다.

동기 실행 (Synchronous Execution)

동기 실행은 현재 스레드에서 작업이 완료될 때까지 코드 실행을 차단하는 방식입니다. 즉, 코드의 다음 라인은 해당 작업이 완료되고 반환될 때까지 실행되지 않습니다.

let queue = DispatchQueue(label: "com.example.queue")

print("Start")

queue.sync {
    for i in 1...3 {
        print("Sync operation \(i)")
    }
}

print("End")

위의 예제에서, print("End")queue.sync 블록의 작업이 완료된 후에 실행됩니다. 따라서 “Sync operation 1”, “Sync operation 2”, “Sync operation 3”이 먼저 출력된 후 “End”가 출력됩니다.

비동기 실행 (Asynchronous Execution)

비동기 실행은 현재 스레드를 차단하지 않고 코드를 실행하는 방식입니다. 작업이 완료될 때까지 기다리지 않고, 결과를 콜백 블록을 통해 처리합니다.

print("Start")

queue.async {
    for i in 1...3 {
        print("Async operation \(i)")
    }
}

print("End")

위의 코드에서 queue.async 블록은 현재 스레드를 차단하지 않고 실행되므로, “End”가 “Async operation 1”, “Async operation 2”, “Async operation 3”보다 먼저 출력될 수 있습니다.

결론

동기 실행은 현재 스레드에서 코드 실행을 차단하고 작업이 완료될 때까지 기다리는 반면, 비동기 실행은 작업이 완료될 때까지 기다리지 않고 다음 코드를 실행합니다. 적절한 상황에 맞게 동기 또는 비동기 실행을 선택하여 다중 스레드 환경에서의 작업을 효율적으로 처리할 수 있습니다.

이러한 차이를 이해하고 적절히 활용할 수 있다면, Swift에서 GCD를 사용하여 병렬 처리를 효율적으로 수행할 수 있습니다.

참고: Apple Developer Documentation - Grand Central Dispatch (GCD)