티스토리 뷰
GCD (Grand Central Dispatch)
- 동시성을 제공하기 위해 사용하는 API
- Queue에 작업을 보내면 알아서 스레드를 할당하고 안전하게 수행
- GCD에서 사용하는 Queue의 이름이 Dispatch Queue
- 즉, DispatchQueue에 작업을 추가하면 GCD는 작업에 맞는 스레드를 자동으로 생성해서 실행하고, 작업이 종료되면 스레드를 제거
동시성 프로그래밍
- 싱글코어 환경에서 멀티태스킹을 위해 시간을 분할해서 여러 프로세스와 스레드를 번갈아가며 실행함이 과정이 너무 빠르다 보니 동시에 실행되는 것처럼 보이는 것을 말함
- 싱글 코어(멀티 코어에서도 가능)에서 멀티스레드를 동작시키키 위한 방식
queue.sync { task } 동기 vs queue.async { task } 비동기
- 동기는 데이터의 요청과 결과가 한 자리에서 동시에 일어나는 것을 의미
- 비동기는 데이터의 요청과 결과가 동시에 일어나지 않는다는 의미
Serial (직렬) vs Concurrent (동시)
- Serial Queue
- 분산 처리 시킨 작업을 "한개의 스레드에서" 처리하는 큐
- task의 시작과 종료에 대한 순서 예측이 가능
- 늦게 실행 된 것이 먼저 끝나는 상황 방지
- 느림
- Concurrent Queue
- 분산 처리 시킨 작업을 "여러 개의 스레드에서" 처리하는 큐
- 끝나는 순서는 알 수 없음
- 빠름
DispatchQueue의 타입
(1) Main Queue
- 메인 쓰레드에서 작동하는 큐로, UI 요소와 관련된 부분들을 담당
- Serial Queue
(2) Global Queue
- 모든 시스템에 공유되는 Concurrent Queue
- QoS를 통해 우선순위를 관리 할 수 있음
- userInteractive : 애니메이션, 이벤트 처리나 지연이 적은 작업 등에 사용 (사용자와 직접 상호작용 하는 작업)
- userInitiated: 사용자가 즉각적인 결과를 기다리고 있고 UI 상호 작용을 계속하는 데 필요한 작업에 사용 (거의 바로 수행)
- default:userInitiated보다 덜 중요한 일반적인 작업
- utility : Progress indicator가 보이는 것과 같은 오래 걸리느(수초 ~ 수분 걸리는 작업)
- background : 사용자 인식에 관계없는 작업(영상 다운로드 등)
(3) Custom Queue
- 직접 만드는 Queue
- 디폴트로 serial 특성을 가진 Queue지만 concurrent로 설정 가능
- Qos 설정 가능
GCD 사용 시 주의 사항
1) UI는 main 스레드에서 처리함
2-1) Main Queue에서 다른 Queue로 작업을 보낼 때 sync를 사용하면 안됨
- 메인 스레드는 UI를 업데이트 해야하는데, 다른 작업들이 끝날 때까지 기다린다면 해당 작업이 끝날 때까지 UI업데이트가 지연되기 때문에 안됨
2-2) 현재와 같은 Queue에 sync로 작업을 보내면 안됨
- 같은 Queue에 보내면 같은 스레드에 배치될 수 있는데, 해당 스레드가 sync로 인해 멈춰있는 상황이라면 데드락 상황이 발생함
- 다른 Qos 큐라면 데드락 발생 가능성이 없음
- 따라서 메인 스레드에서 DispatchQueue.main.sync를 사용하면 안됨
Reference :
'iOS Programming' 카테고리의 다른 글
[iOS] WKNavigationDelegate (0) | 2023.05.14 |
---|---|
[iOS] 카카오톡 공유하기 메시지 보내기 (0) | 2023.05.13 |
[iOS] Delegate Pattern (0) | 2023.02.12 |
Executable Not Found. ~~~ is not a valid path to an executable file 에러 해결 (0) | 2022.01.09 |
The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation 에러 해결 (0) | 2022.01.09 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 멀티프로세스
- 슈퍼스칼라
- Swift
- RxSwift
- 프로세스
- swiftsoup
- 운영체제
- cs
- OS
- PHAsset
- returnKey
- 쓰레드
- WKUIDelegate
- ios
- optional
- PHImageRequestOptions
- Xcode
- 개발대외활동
- 프로세스간통신
- URLComponents
- 디프만
- rxcocoa
- setBackgroundColor
- 개발동아리
- webcrawl
- isNetworkAccessAllowed
- sharedmemory
- 부캠
- 스냅킷
- 스레드
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함