비동기란 ?
•
작업을 다른 thread로 보내고 즉시 리턴을 해서 그 일이 끝나는 것과 상관 없이 그 다음 작업을 처리 하는 방식
•
일을 시작시키고, 작업이 끝날 때까지 기다리지 않고 다른 일 처리를 시작할 수 있다.
•
N-Blocking 개념 사용
DispatchQueue.global().async {
//다른 쓰레드로 보낼 작업을 배치
}
Swift
복사
//예시 결과
// 위의 코드랑 아래의 코드는 전혀다르다. 순서를 보장할 수 없다.
Task2-3
Task1-1
Task1-2
Task1-3
Task1 종료
Task2 종료
Task2 시작
Task2-2
Task2-1
Swift
복사
// 전체가 하나의 작업 ===> 내부적으로는 동기적으로 동작
DispatchQueue.global().async {
print("Task1 시작")
print("Task1-1")
print("Task1-2")
print("Task1-3")
print("Task1 종료")
}
// 위의 코드랑 아래의 코드는 전혀다름... 순서를 보장할 수 없음
// 아래의 코드는 작업이 5개로 분할된 개념
DispatchQueue.global().async {
print("Task2 시작")
}
DispatchQueue.global().async {
print("Task2-1")
}
DispatchQueue.global().async {
print("Task2-2")
}
DispatchQueue.global().async {
print("Task2-3")
}
DispatchQueue.global().async {
print("Task2 종료")
}
Swift
복사
비동기적으로 구현된 메서드 예시
동기란 ?
•
작업을 다른 thread로 보냈을 때 그 작업이 끝날 때 까지 Block한다.
•
Blocking 개념 사용
// 공통 code
func task1() {
print("Task 1 시작")
sleep(4)
print("Task 1 완료★")
}
func task2() {
print("Task 2 시작")
sleep(4)
print("Task 2 완료★")
}
func task3() {
print("Task 3 시작")
sleep(4)
print("Task 3 완료★")
Swift
복사
// 동기
print("1")
task1()
task2()
task3()
print("2")
------------
1
Task 1 시작
Task 1 완료★
Task 2 시작
Task 2 완료★
Task 3 시작
Task 3 완료
2
Swift
복사
//비동기
print("1")
DispatchQueue.global().async {
task1()
}
DispatchQueue.global().async {
task2()
}
DispatchQueue.global().async {
task3()
}
print("2")
-----------
1
2
Task 1 시작
Task 2 시작
Task 3 시작
Swift
복사
비동기를 하는 부분?
•
네크워크 통신, 즉 서버에 데이터를 요청하는 일은 부하가 많이 걸리는 일이다.
→ 아이폰은 1초에 60번 화면을 다시 그리기 때문에 비동기 처리를 하지 않으면 해당 메커니즘이 제대로 동작하지 못하기 때문에 화면이 버벅거리는 현상이 자주 일어난다.
메인 런루프에서 처리하는 작업이 길어지면 1초에 60번 화면을 그려야하는 역할에서 버벅거린다.
< 메인 런루프에서 하는 일 >
앱이 시작될 때 앱을 담당하는 메인 런루프(반복문)이 생긴다.
→ 이벤트 (터치, 스크롤..)를 처리한다.
→ 함수 등의 실행 결과를 화면에 보여준다.
→ 화면을 다시 그린다.
동시성 처리 방법 (DispatchQueue / OperationQueue)
동시성(Concurrency) 프로그래밍이란?
동시성 - 메인 Thread가 아닌 다른 소프트웨어적인 Thread에서 동시에 일을 하는 개념
성능 / 반응성 / 최적화를 좋게 해준다.
작업(Task)을 “대기행렬(Queue)”에 보내기만 하면, 운영체제시스템이 알아서 여러 Thread로 나눠서 분산처라(동시적 처리)를 한다.
DispatchQueue (GCD)(”도내다”,”큐에”)
•
직접적으로 Thread를 관리하는 개념이 아닌, 대기열(Queue)의 개념을 이용해서 작업을 분산처리하고, OS에서 알아서 Thread 갯수를 관리
•
메인Thread가 아닌 다른 Thread에서 오래걸리는 작업(ex.네트워크 처리)들과 같은 작업들이 쉽게 비동기적으로 동작하도록 함
•
DispatchQueue.main //글로벌 메인 큐
DispatchQueue.global() //글로벌 큐
DispatchQueue(label:"...") //브라이빗(custom) 큐
Swift
복사
OperationQueue
OperationQueue.main //메인 큐
OperationQueue() //브라이빗(custom) 큐
Swift
복사
큐(Queue)의 종류 (공부중…)
직렬(Serial) vs 동시(Concurrent)
직렬
•
분산처리 시킨 작업을 “다른 한개의 Thread”에서 처리하는 큐
•
순서가 중요한 작업을 처리할 때 사용
동시
•
분산처리 시킨 작업을 “다른 여러개의 Thread”에서 처리하는 큐
•
각자 독립적이지만 유사한 여러개의 작업을 처리할 때 사용
Async / await (공부 예정🥹)
퀴이즈 (같이 해결해 보아요…)
1.
Swift에서 Async/Await 기능이 도입되기 전에, 비동기(Asynchronous) 작업을 처리하는 방법에는 어떤 것들이 있나요?
2.
동기와 비동기의 차이점을 설명하고, 어떤 경우에 동기, 비동기를 사용하는지 말씀해 주세요
3.
한 화면에 썸네일이 100개 정도 있다고 치고, 100개의 각각의 통신을 하게 된다면, GCD는 이걸 버텨낼까요? GCD는 몇가지의 쓰레드까지 가능할까요? 해결 방법은?
4.
Thread 관리는 어떻게 하나요? GCD에 대해 설명해주세요.
5.
NSOperationQueue 와 GCD Queue 의 차이점을 설명하시오.
6.
GCD API 동작 방식과 필요성에 대해 설명하시오.
7.
Global DispatchQueue 의 Qos 에는 어떤 종류가 있는지, 각각 어떤 의미인지 설명하시오.
8.
task동작 방식과 gcd, nsoperation과의 차이점을 설명하시오.