๐ Dispatch Queue
Queue : FIFO ๊ตฌ์กฐ
- Serial Queue
- ์ด์ ์์ ์ด ๋๋๋ฉด ๋ค์ ์์ ์ ์์ฐจ์ ์ผ๋ก ์คํํ๋ ์ง๋ ฌ ํํ
- Concurrent Queue
- ์ด์ ์์ ์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ด ์๋, ๋์์ ์คํ๋๋ ๋ณ๋ ฌ ํํ
๐ GCD
GCD : Multi Process๋ฅผ ์ํ Thread Programming์ ๋ฐฉ๋ฒ
๊ธฐ์กด์ Thread Programming์ ํ๊ธฐ ์ํด์๋ ๋๊ธฐํ๋ ๊ด๋ฆฌ๋ฅผ ํด์ค์ผํ๊ณ ,
deadlock๋ ๊ด๋ฆฌ๋ฅผ ํ๋ ๋ฑ ์ค๋ ๋ํ์ ์ง์ ๊ด๋ฆฌํด์ผํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์์ง๋ง,
์ ํ์์ ๋ฐ๋ก GCD๋ฅผ ํตํด์ ์ฐ๋ ๋๋ฅผ OS์์ ๊ด๋ฆฌํ๊ณ ๋ถ๋ฐฐํ๊ฒ ๋๋ค.
๋ฐ๋ผ์ Swift์์๋ Thread ๊ด๋ จ ์์ ์ Grand Central Dispatch API ( GCD )๋ฅผ ํตํด ์ฒ๋ฆฌํ๋ค.
์ด๋์์ ์ ์ด๋ Thread๊ฐ ํ ๊ฒ์ธ์ง, Multi-Thread๋ก ํ ๊ฒ์ธ์ง, ์ฝ์ด๋ฅผ ์ฌ๋ฌ๊ฐ ์ฌ์ฉํ ๊ฒ์ธ์ง, Async๋ก ์ฒ๋ฆฌํ ๊ฒ์ธ์ง ๊ฒฐ์ ํด์ฃผ๋ ๊ฒ์ด ๋ฐ๋ก GCD ์ด๋ค.
๐ Dispatch Queue ์ฝ๋
DispatchQueue.main.async{
// code..
}
DispatchQueue.global().async{
// code..
}
GCD์์ ์ ๊ณตํ๋ Queue๋ 3๊ฐ์ง๋ก ๋๋๊ฒ ๋๋ค.
- main(serial)
- global(concurrent)
- ์ปค์คํ
๐ main(serial)
๋ฉ์ธ ์ฐ๋ ๋์์ ์ฒ๋ฆฌ๋๋ Serial Queueํํ๋ก, ์ฐ๋ฆฌ๊ฐ ์ฐ๊ณ ์๋ UiKit์ ๋ชจ๋ ์์๋ค์ Main Queue์์ ์ํํด์ผ ํ๋ค.
์ฑ์ ๋ฉ์ธ ์ฐ๋ ๋์์ task๋ฅผ ์ฒ๋ฆฌํ๋ ์ ์ญ์ ์ผ๋ก ์ฌ์ฉ๊ฐ๋ฅํ Serial Queue ํํ์ด๋ค. ์ด ๋ฉ์ธ ํ๋ ์ฑ์ ์คํ๋ฃจํ์ ํจ๊ป ์๋ํ์ฌ ํ์ ์๋ task์ ์คํ์ ์คํ ๋ฃจํ์ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ์ด๋ฒคํธ ์์ค์ ์คํ๊ณผ ์ฝํ๋ค.
๊ฐํน Dispatch Queue๋ฅผ ์ฌ์ฉํ๋ค๊ฐ, main.sync๋ฅผ ํ๋ฉด ์ฑ์ด ์ฃฝ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ ์ ํ๋ฉด ์๋๋?
Zedd0202๋์ด ๋ฐ๋ก ์ ๋ฆฌํ ํฌ์คํ ์ ์ฐธ๊ณ ํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
https://zeddios.tistory.com/519
๐ global (concurrent)
์ ์ฒด ์์คํ ์์ ๊ณต์ ๋๋ concurrent queue์ด๋ค. ์์์ concurrent queue๋ ๋์์ ์งํ๋๋ค๊ณ ํ๋๋ฐ, ๋ฐ์์ ์ค๋ช ํ Qos๋ฅผ ํตํด์ ์์ ์ ์ฐ์ ์์๋ฅผ ๊ฒฐ์ ํ๋ค.
๐ Qos
Quality of Service์ ์ฝ์๋ก, Dispatch Queue์์ ์ํ ํ ์์ ์ ๋ถ๋ฅํ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ค.
ํด๋น Qos๋ฅผ ์ง์ ํด์ค์ ์ค์๋๋ฅผ ํ์ํ๊ณ , ์์คํ ์ด ์ฐ์ ์์๋ฅผ ์ ํ๊ณ ์ด์๋ฐ๋ผ ์ค์ผ์ฅด๋ง์ ํ๊ฒ ๋๋ค.
์ฐ์ ์์๊ฐ ๋์ ์์ ์ ์ฐ์ ์์๊ฐ ๋ฎ์ ์์ ๋ณด๋ค ๋นจ๋ฆฌ ์ํ๋๊ณ , ์ ์ค๊ณํ๋ค๋ฉด ์กฐ๊ธ ๋ ๋ฐ์์ ์ธ ์ฑ์ ๋ง๋ค์ด ๋ผ ์ ์๋ค.
DispatchQueue.global(qos: .background){
// code..
}
๐ก Qos ์ข ๋ฅ
>> Qos์ ์ฐ์ ์์
userInteractive
userInitiated
default
utility
background
unspecified
์ฐ์ ์์๋ฅผ ์ฌ์ฉ์๊ฐ ์ ํํ ์ ์๋๋ฐ, ๋น์ฅ ๊ธํ๊ฒ ์ ๊ทผํด์ผ ํ๋ ์์ ์ด๋ผ๋ฉด UserInteractive๋ฅผ ์ฌ์ฉํ๊ณ ,
๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ฒ์ฒํ ์์ ํด๋ ๋๋ค๋ฉด background๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
๐ ์ปค์คํ
๊ฐ๋ฐ์๊ฐ ์์๋ก Queue๋ฅผ ์์ฑํด ์ฌ์ฉํ๊ฒ ๋๋ค. ๋ณดํต์ Serial Queue๋ฅผ ๋ง๋ค๋ ์ฌ์ฉ์๊ฐ ์ปค์คํ ํด์ main queue์์ ์ฒ๋ฆฌํ์ง ๋ชปํ ๋ด์ฉ๋ค์ ๋ฐ๋ก ๋นผ์ ์์ ํ ๋ ์ฌ์ฉํ๊ฒ ๋๋ค. ์ด๋ ๊ฒ ๋ง๋ค์ด์ง ์ปค์คํ Queue๋ Global Queue์์ ์ํ ๋๋ค.
๐ sync / async
sync : ํ์ ์์ ์ ์ถ๊ฐํ๋ค๋ฉด, ๊ทธ๊ฒ ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ
async : sync์ ๋ค๋ฅด๊ฒ ์ผ๋จ ํ์ ์์ ์ ์ถ๊ฐํ๊ณ , ๋์์ ๋ค๋ฅธ ์์ ์ ํ ์ ์๋ ๊ฒ
๐ sync
๋ค์์ฒ๋ผ sync๋ฅผ ๊ฑธ์ด๋๊ฒ ๋๋ฉด 1,2,3,4,5๊ฐ ์ฐํ๋ ์์ ์ด ๋๋ ๋ค์๋ง 100, 101, 102...๊ฐ ์ฐํ๊ฒ ๋๋ค.
1~5๋ฅผ sync๋ก ๊ฑธ์ด๋จ๊ธฐ ๋๋ฌธ์ด๋ค.
DispatchQueue.global().synnc{
for i in 1...5 {
print(i)
}
}
for i in 100...105 {
print(i)
}
๐ async
async๋ฅผ ๊ฑธ์ด๋๊ฒ๋๋ฉด ๋์์ ์งํ๋๊ธฐ ๋๋ฌธ์ 1๊ณผ 200๊ณผ 100์ด ์์ฌ๋์จ๋ค.
๊ทธ๋ฆฌ๊ณ ๋์์ ์งํ๋๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ๋ ๋งค๋ฒ ๋ฌ๋ผ์ง๋ค.
DispatchQueue.global().async{
for i in 1...5 {
print(i);
}
}
DispatchQueue.global().async {
for i in 200...205 {
print(i)
}
}
for i in 100...105 {
print(i)
}
์ด GCD๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ค๋ฉด ๋ฐ๋ก ์ฐ๋ ๋๋ค์ ๊ด๋ฆฌํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ๊ฐํธํ๋ค.
'๐ iOS > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS][Swift] Dismiss Live Activities on App Termination ( feat. Semaphore ) (0) | 2025.01.09 |
---|---|
[Swift][iOS] GCD API ๋์ ๋ฐฉ์๊ณผ ํ์์ฑ (1) (0) | 2023.06.13 |
[Swift][iOS] QOS (0) | 2023.06.13 |
[Swift] Struct์ Class์ ์ฐจ์ด์ (1) | 2023.05.15 |