슈프림 블로그
[iOS] 동시성 프로그래밍 - 동기/비동기 , 직렬/동시 본문
동기(Sync) vs 비동기(Async)
대기열을 어떤 방식으로 처리할지 정하는 것이다.
비동기
메인스레드에서 다른 스레드에게 작업을 시작 시키고 작업이 끝날때까지 기다리지 않는다.
메인스레드가 바로 다른 작업을 시작할 수 있게 된다.
DispatchQueue.global().async {...}
동기
메인스레드에서 다른 스레드에게 작업을 시키고, 끝날때까지 기다린다.
해당 작업이 끝날 때 까지 메인 스레드는 다른 작업 하지 않고 Block상태를 유지한다.
영상 싱크가 맞는다?? 영상 로딩이 될 때 까지 음성도 기다렸다가 시점이 맞아야 비로소 재생됨을 떠올리면 좋을 것이다.
DispatchQueue.global().sync {...}
+ 다른 스레드로 작업을 보내는 개념이긴 하지만, 작업 끝날 때 까지 기다리게 되므로 동기처리 된 작업은 실질적으로 메인쓰레드에서 처리된다.
👉 따라서,,!! 오래 걸리는 작업을 하는 동안, 다른 작업도 할 수 있도록 하기 위함이므로 대부분 비동기로 처리할 예정이다
👉 동기 처리가 필요한 부분은 심화 과정으로, 나중에 다룸
직렬(Serial) vs 동시(Concurrent)
어떤 대기열을 사용할 것인지 정하는 것이다.
학문적으로 iOS 프로그래밍에서는 직렬과 병렬이 아닌, 직렬과 동시라고 표현하고 있다.
Serial큐 : 단 하나의 쓰레드로만 작업을 보내는 대기열
Concurrent큐 : 여러개의 다른 쓰레드로 작업을 보내는 대기열
각 큐가 작업을 처리하는 흐름을 보자면
메인쓰레드에서 작업을 분산처리를 시킨다 (큐에 넣는다)
어떤 큐로 작업을 넣는지가 중요하다.
- 직렬큐인 경우 -> 다른 단 한개의 쓰레드에서만 처리함.
- 동시큐인경우 -> 여러개의 쓰레드로 또 다시 분산하여 처리함.
그럼 왜 직렬큐가 필요할까??
직렬큐는 순서가 중요한 작업을 처리할 때 사용한다.
동시큐는 독립적이지만 유사한 여러개의 작업을 처리할 때 사용한다.
예를 들어, TableView의 각 셀에서 이미지를 로드해야 할 경우
공통적으로 이미지 다운로드라는 연관성을 갖고 있지만
순서가 중요하지 않고, 각 셀이 따로 다운로드를 처리하면 되기 때문에 동시 큐를 사용하면 좋다.
위 포스팅은 인프런 강의 "iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해 " 를 시청하고 작성한 글입니다.
www.inflearn.com/course/iOS-Concurrency-GCD-Operation/dashboard
'iOS_Swift' 카테고리의 다른 글
[iOS/Swift] HTTP/HTTPS 통신의 기본, URLSession (0) | 2020.12.29 |
---|---|
[iOS] 디스패치큐(GCD)의 종류와 특징, 그리고 주의사항 (1) | 2020.12.05 |
[iOS] 동시성 프로그래밍 - GCD, Operation 개요 (0) | 2020.12.05 |
[Swift] String 관련 함수들 (3) | 2020.12.05 |
[Swift] Array 관련 함수들 2 (1) | 2020.11.01 |