-
[사전캠프 TIL 4일차] 비동기 프로그래밍 (with. GCD 💝)iOS💖 2025. 2. 6. 19:31
학습 키워드
비동기 프로그래밍
동기 vs 비동기
동기 (Syncronouse) : 작업이 완료될 때 까지 대기, 완료후에 다음 작업 수행
비동기 (Asyncronouse) : 작업 완료를 기다리지 않고, 바로 다음 작업 수행
비동기 프로그래밍
- UI 작업 / 백그라운드 작업을 효율적 처리하는데 필수적!!
- 작업을 동시에 실행하거나, 완료 여부 기다리지 않고 next 작업을 수행할 수 있는 프로그래밍 방식
- iOS에서는 주로 GCD (Grand Central Dispatch) / 비동기 메서드를 사용
GCD (Grand Central Dispatch) ?
- iOS에서 multi-core processer 에 코드를 동시에 실행시키게 해주는 프레임워크!
- GCD에서 사용하는 Queue가, DispatchQueue
- iOS 에서 task 요청*이 들어오면,
개발자가 코드에서 별도의 처리를 하지 않았다면, 모든 task는 Main Thread 에서 수행 🔴 된다.
이를 해결한 것이, GCD
(* 네트워킹 (이미지/영상 다운로드), 단순 연산, 프린트 작업 대기열, 시간 오래걸리는 작업 등.. ) - 개발자가 DispatchQueue에 task을 보내면, GCD는 다수의 thread를 적절히 생성 / 실행 & 작업종료 시 thread 제거
Dispatch Queue의 종류
- Main Queue : UI 작업 / 사용자 인터랙션 을 처리
- Global Queue : 백그라운드 작업 처리 (복잡한 계산 / 네트워킹 (이미지/영상 download) etc..)
- Custom Queue : 사용자 정의 작업 큐 (직접 Queue 생성해서 관리해야하는 경우)
- 두 개의 Queue 같이 쓰기 (예) 백그라운드에서 다운받고, UI 에 띄워주는 작업)
코드 예시
: 백그라운드에서 "비동기 작업 실행" 이라는 출력을 실행하고, UI 에 "UI 업데이트" 를 띄우세요
- DispatchQueue : iOS 에서 동시성 프로그래밍을 돕기 위해 제공하는 Queue
- global : DispatchQueue의 종류
- async : 비동기
- { } : 작업의 한 단위
- 작업 안의 동작들은 순차적으로 처리된다.
DispatchQueue.global().async { print("비동기 작업 실행") DispatchQueue.main.async { print("UI 업데이트") } }Global Queue
Queue에 들어가는 task의 우선순위를 Qos class 를 통해 표현한다.
QoS (Quality of Service)
- qos 의 우선순위에 대해 알아보자
- global 의 인자 qos 에 넣어주면, 우선순위를 정해주고, 이에 따라 스케줄링 해준다.
- .userInteractive
- 바로 수행돼야 하는 작업
- 바로 수행돼야 하는 작업
- .userInitiated
- 사용자가 결과를 기다리는 작업
- 사용자가 결과를 기다리는 작업
- .default
- 잘 사용 x, .userInitiated 보다 더 오래걸리는 작업
- 잘 사용 x, .userInitiated 보다 더 오래걸리는 작업
- .utility
- 꽤 무거운 작업 (네트워킹 작업 / 파일 불러오기 등)
- 꽤 무거운 작업 (네트워킹 작업 / 파일 불러오기 등)
- .background
- 무거운 작업 (영상 다운로드 / 위치 업데이트 등)
- 사용자에게 당장 인식될 필요 없음
코드 예시)
DispatchQueue.global(qos: .background).async { // task } DispatchQueue.global(qos: .default).async { // task }
직접 구현해보기
1. 비동기 데이터 처리:
DispatchQueue.global()을 사용하여 백그라운드에서 숫자를 1부터 5까지 출력한 후, Main Queue에서 "UI 업데이트 완료"를 출력하세요.
import Dispatch DispatchQueue.global().async { for i in 1...5 { print(i) } DispatchQueue.main.async { print("UI 업데이트 완료") } }2. 네트워크 시뮬레이션:
DispatchQueue 를 사용해 다음을 구현하세요:
3초간 데이터를 로드하는 작업을 비동기로 수행.
작업 완료 후, "데이터 로드 완료" 메시지를 메인 큐에서 출력.
DispatchQueue.global().async { // task : 데이터 로드 DispatchQueue.main.asyncAfter(deadline: .now() + 0.3, execute: { print("데이터 로드 완료") }) }
회고
api, image, video 등을 처리하는 경우, 앱이 무거워 지게되니.. 메모리 관리에 대해 계속 공부해야할 것 같다.
오늘, 내배캠 1기 졸업생분과 QnA 하는 시간을 가졌는데.. 더 열심히 해야겠다는 생각이 들었다 ㅎㅎ
출처
https://velog.io/@nnnyeong/iOS-GCD-Grand-Central-Dispatch-%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC
[iOS] GCD (Grand Central Dispatch) 에 대하여
GCD 란? GCD 는 iOS 에서 멀티코어 프로세서에 코드를 동시에 실행시키게 해주는 프레임워크이다. GCD는 iOS 에서 멀티 스레드 환경에서 다수의 스레드에 작업을 적절히 분배시키는 방법 GCD 에서 사
velog.io
https://develop-ssooo.tistory.com/156
[iOS] GCD + DispatchQueue
안녕하세요 :ㅇ GCD + DispatchQueue에대해 알아보겠습니다 :D 동기 & 비동기에 대해서 모르시는 분은 동기(Sync) / 비동기(Async)글을 참고하고 와주세요! Concurrency(동시성) 란? 쉽게 설명하자면, 한번에
develop-ssooo.tistory.com
'iOS💖' 카테고리의 다른 글
[사전캠프 TIL 6일차] GCD (Serial vs. Concurrent) (0) 2025.02.12 [사전캠프 TIL 5일차] GCD (+α), Operation (0) 2025.02.07 [사전캠프 TIL 3일차] ARC / 클로저 / OOP (1) 2025.02.05 [사전캠프 TIL 2일차] 자료구조 / 메모리 구조 (2) 2025.02.04 [사전캠프 TIL 1일차] Struct / Class / Protocol (0) 2025.02.03