dev._.note

[Swift] 동기와 비동기 본문

Dev/SWIFT

[Swift] 동기와 비동기

Laena 2023. 12. 18. 20:27

동기 (Synchronous) vs. 비동기 (Asynchronous)

  • 동기(Sync) : 작업이 순차적으로 실행되는 것을 의미. 한 작업이 끝날 때까지 다음 작업이 기다리며, 작업이 순서대로 실행.
  • 비동기(Async) : 작업이 별도의 스레드 또는 백그라운드에서 실행되며, 다른 작업을 기다리지 않고 동시에 실행. 작업이 완료되면 콜백(callback) 또는 완료 핸들러(completion handler)를 통해 결과를 처리. 메서드 호출 순서대로 작업이 완료된다는 것이 보장되지 않음.

직렬(Serial) vs 동시(Concurrent)

  • 직렬(Serial) : 분산처리 시킨 작업을 오직 한 개의 쓰레드에서만 처리하는 것이 직렬이. 즉, A 쓰레드에서 4개의 작업을 분산처리 시켰는데, B 쓰레드에서만 처리.
  • 동시(Concurrent) : 몇 개의 쓰레드로 분산할지는 시스템이 정하지만, 시스템이 정한 여러개의 쓰레드로 분산 처리하는 것. 작업들이 각자 독립적이지만 유사한 작업들일 때 굉장히 유용.(예를 들면 테이블뷰 셀 같은 것들을 서버에서 받아오는 것)

DispatchQueue

  • Grand Central Dispatch(GCD)는 iOS, macOS 등의 Apple 플랫폼에서 멀티스레드 프로그래밍을 간단하고 효율적으로 구현하기 위한 기술. GCD는 다양한 작업을 관리하고 실행하기 위한 강력한 API를 제공하여 병렬성을 활용.

GCD의 특징:

  1. 큐(Queue) 기반의 작업 관리: GCD는 큐를 사용하여 작업을 관리. 이를 통해 작업을 세분화하고, 실행할 큐에 따라 작업의 속성을 결정.
  2. 간편한 비동기 작업 처리: GCD를 사용하면 비동기적으로 작업을 수행 가능. 별도의 스레드를 관리하지 않아도 되므로 개발을 간편하게 만듬.
  3. 큐의 종류에 따른 다양한 동작 방식: GCD에는 Serial Queue와 Concurrent Queue가 있음. Serial Queue는 작업이 순차적으로 실행되며, Concurrent Queue는 여러 작업이 동시에 실행가능.
  4. 콜백을 통한 작업 완료 처리: 작업이 완료되면 콜백(closure)을 사용하여 결과를 처리.
  5. QoS(Quality of Service) 지원: GCD는 각 큐에 대한 우선순위 설정을 지원하여 시스템이 작업을 적절히 관리하고 최적의 성능을 유지.

DispatchQueue.main:

  • DispatchQueue.main은 주로 앱의 UI 업데이트와 관련된 작업을 처리하는데 사용.
  • 메인 스레드에서 동작하며, 주로 사용자 인터페이스(UI)를 업데이트하거나 사용자와의 상호작용을 처리할 때 사용.
  • UI 업데이트나 사용자 이벤트 처리와 같이 메인 스레드에서 실행되어야 하는 작업들은 DispatchQueue.main을 통해 실행.
  • 메인 스레드는 UI와 관련된 작업들을 담당하기 때문에, 주의해서 사용하지 않으면 UI의 응답성이 떨어질 수 있음. 긴 작업이 메인 스레드에서 실행되면 앱이 멈추거나 뚝뚝 끊기는 현상이 발생 가능.

DispatchQueue.global():

  • DispatchQueue.global()은 전역(백그라운드) 스레드에서 작업을 처리하는데 사용.
  • 여러 스레드에서 동시에 실행되는 비동기 작업을 처리할 때 유용.
  • 전역 DispatchQueue에서 async 또는 sync를 사용하여 작업을 추가하면, 해당 작업은 백그라운드에서 실행.
// 동기적으로 실행되는 작업
DispatchQueue.global().sync {
    print("Synchronous Task")
}

// 비동기적으로 실행되는 작업
DispatchQueue.global().async {
    print("Asynchronous Task")
}

// 백그라운드에서 비동기 작업 실행
DispatchQueue.global().async {
    // 여기서 백그라운드에서 실행될 작업을 수행.
    for i in 1...5 {
        print("Background Task \(i)")
    }
    
    // 작업이 완료되었음을 메인 스레드로 알림.
    DispatchQueue.main.async {
        print("Background Task Completed, Updating UI")
        // UI 업데이트 등을 수행.
    }
}

/*
위의 예시는 DispatchQueue.global().async를 사용하여 백그라운드에서 비동기 작업을 
실행하는 코드. 이 코드는 백그라운드에서 1부터 5까지의 작업을 실행한 후, 
해당 작업이 완료된 후에 메인 스레드에서 UI 업데이트를 실행.
*/

'Dev > SWIFT' 카테고리의 다른 글

[Swfit] Combine 도구  (0) 2023.12.18
[Swift] 반응형 프로그래밍  (0) 2023.12.18
[Swift] 강한 참조 순환 문제와 해결방법  (1) 2023.12.15
[Swift] 스레드(Thread)  (0) 2023.12.14
[Swift] 프로토콜(Protocol)  (0) 2023.12.13