[Swift] Concurrency 동시성
동시성 프로그래밍이 필요한 이유
iOS 앱 개발 시 비동기적인 작업을 제대로 처리 하지 않으면 버벅이는 상황을 경험한 적 있을 것이다. 동기적으로 작업이 이루어졌기 때문에 그러한 증상을 볼 수 있는데 메인 스레드가 아닌 다른 스레드로 작업을 분산 처리하여 비동기적인 코드를 작성하여 이러한 문제를 해결할 수 있을 것이다.
Swift에서는 직접적으로 스레드를 관리하지 않는다. 큐에 작업을 할당하면 Swift는 알아서 적절한 스레드에 작업을 할당한다.
위에서 말한 큐는 Swift에서 제공하는 GCD(DispatchQueue)와 Operation(OperationQueue) 등을 활용할 수 있다.
비동기(Async)의 개념
- 메인 스레드가 작업을 다른 스레드에 보내고 그 작업이 끝나길 기다리지 않고 메인 스레드는 다른 일을 한다.
- task1이 다른 스레드에서 작업이 진행되는 동안 메인 스레드는 task2를 수행함
DispatchQueue.global().async{
// 비동기 작업
}

동기(Sync)의 개념
- 메인 스레드가 다른 스레드에 작업을 보내고 그 작업이 끝날 때까지 block 상태가 되어 기다린다.
- task1이 다른 스레드에서 작업이 끝날 때까지 기다렸다가 끝나면 메인스레드에서 task2를 진행할 수 있다.
- 하지만 Swift에서는 메인 스레드에서 다른 작업에 동기적인 작업을 하라고 해도 메인 스레드에서 실행된다고 한다.
DispatchQueue.global().sync{
// 동기 작업
}

비동기의 개념이 일반적으로 필요한 이유는 대부분 네트워크 작업 때문이다. 네트워크와 관련된 작업들은 내부적으로 비동적으로 프로그래밍 되어 있다. URLSession...
직렬과 동시
Serial 큐
- 한 개의 스레드로만 작업을 보낸다.
- 보통 메인에서 분산처리 시킨 작업을 다른 한 개의 쓰레드에서 처리하는 큐

Concurrent 큐
- 다른 여러 개의 쓰레드에 작업을 보낸다
- 보통 메인에서 분산처리 시킨 작업을 다른 여러 개의 쓰레드에서 처리하는 큐

분산처리 시에 concurrent 큐가 무조건 좋아 보이는 데 왜 Serial 큐가 필요할까?
직렬 큐 - 순서가 중요한 작업을 처리할 때 사용한다.
동시 큐 - 각자 독립적이지만 유사한 여러 개의 작업을 처리할 때 사용한다. (CollectionView Cell에 image 다운로드 처리...)
정리
동기와 비동기는 메인 스레드가 다른 스레드에게 작업을 보낼 때 그 작업이 끝나길 기다리느냐 기다리지 않느냐에 대한 것
직렬과 동시는 메인 스레드에서 다른 스레드에게 작업을 보낼 때 한 개의 스레드에 보내는지 여러 개의 스레드에서 보내는지에 대한 것
https://www.inflearn.com/course/ios-concurrency-gcd-operation/dashboard
앨런 iOS Concurrency(동시성) - 디스패치큐와 오퍼레이션큐의 이해 강의 | 앨런(Allen) - 인프런
앨런(Allen) | , 🙋🏻♂️ 자가 진단표 수업 후에는 아래의 개념들에 대해 명확히 알고, 이해하실 수 있습니다. 디스패치큐의 개념에 대해서 명확히 이해하고 있다. (Yes/No) 디스패치큐의 종류
www.inflearn.com