Inflearn: iOS Concurrency ํ๋ก๊ทธ๋๋ฐ ๊ฐ์ ์ ๋ฆฌ
1. GCD/Operation์ ์์
1) ์ ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ด ํ์ํ ๊น?
์ฐ๋ ๋ : ์ผํ๋ ๋ ์๋ค
: ์์ดํฐ 11ํ๋ก 6์ฝ์ด ( ์ผ์ํ๋ ๋ ์์ด 6๊ฐ๊ฐ ๋ฌ๋ ค์๋ค, ๋ช๊ฐ์ ์ฐ๋ ๋๊ฐ ์๋์ง๋ ์๋ ค์ง์ง ์์ ๋๋ต 12๊ฐ ์ด์ ์ ๋)
์์ดํฐ์ 16๋ฐ๋ฆฌ์ 1์ด๋ง๋ค ๊ต์ฅํ ๋น ๋ฅด๊ฒ ๋ฆฌํ๋ ์ฑ์ ํ๋๋ฐ
๊ทธ ์์ ์ ๋ฌด์ธ๊ฐ๊ฐ ๋ฐฉํดํ๊ณ ์์ด์ ์์์ฒ๋ผ ๋ฒ๋ฒ ์ด๋ ํ์ ๋ฐ์ํ๋ค!
์์ดํฐ์ ์ผํ๋ ๋ ์์ด ์ฌ๋ฟ์ธ๋ฐ ์ ๋ฒ๋ฒ ์๋๊ฐ?
๐ก → ํ๊ฐ์ ์ฐ๋ ๋์์๋ง ์ผ์ ์์ผฐ๊ธฐ ๋๋ฌธ์ ๋ฒ๋ฒ ์ธ ๊ฒ.
cmd + 7 ๋๋ฅด๋ฉด ์์ฒ๋ผ ์ด๋ค ์ค๋ ๋๊ฐ ์ผํ๊ณ ์๋์ง ํ์ธ ๊ฐ๋ฅ
ํ๋ก๊ทธ๋๋ฐ์ ์๋ชปํด์ ์ฐ์ฐ์ฐฎ๊ฒ ํ๋ฉด์ ๊ด๋ฆฌํ๋ ํ ๊ฐ์ ์ค๋ ๋๋ง ๊ณ์ ์ฌ์ฉํด์ ๋ฒ๋ฒ ์ด๊ฒ ๋จ
๊ทธ๋์์๋ ์ฐ๋ฆฌ๊ฐ ์์ ์ผ๋ค๋ก๋ง ์์ผ์ ๋ฒ๋ฒ ์ด๋ ๊ฒ์ ๋ชป ๋๋ผ๊ณ ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ํ์์ฑ์ ๋ชป ๋๊ผ๋ค!
์๋์ ์ผ๋ค์ ์ค๋ ๋๊ฐ ์์ฒญ ๋นจ๋ฆฌ ์ฒ๋ฆฌํ ์ ์๋ ์ผ๋ค์ด์ด์ ๋ฒ๋ฒ ์ X
print("task1: ์ถ๋ ฅํ๊ธฐ")
print("task2: ์ถ๋ ฅํ๊ธฐ")
print("task3: ์ถ๋ ฅํ๊ธฐ")
print("task4: ์ถ๋ ฅํ๊ธฐ")
print("task5: ์ถ๋ ฅํ๊ธฐ")
์์์ ๋ดค๋ ๋ฒ๋ฒ ์ด๋ ํ๋ฉด์ ์์ฒญ๋๊ฒ ๋ง์ ์ผ์ ์์ผฐ๊ธฐ ๋๋ฌธ์ ๋ฒ๋ฒ ์ด๋ ๊ฒ!
(๋คํธ์ํฌ๋ฅผ ํตํด
- ์์ถํ์ผ์ ๋ค์ด๋ก๋
- ์์ถ ํ๊ธฐ
- ์ด๋ฏธ์งํ์ผ ๋ณํ
- ์ ์ ์ด๋ฏธ์ง ํ์
์์ฒญ๋๊ฒ ๋ง์ ์ผ๋ค์ ํ๋์ค์ด๋ผ ๋ถํ๊ฐ ๊ฑธ๋ฆผ ;;)
๊ทธ๋์ ์ฐ๋ฆฌ๋ ..... ๋ณต์ฌ๊ธฐ๊ฐ ์์ฒญ ๋ง์๋ฐ๋ ํ ๋ณต์ฌ๊ธฐ๋ก๋ง ์ผ์ํ๋ ๋ฐ๋ณด๊ฐ์ ์ง์ ... ํ๊ณ ์๋ ๊ฒ...
๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ์ด๋ฌํ ๋ง์ ์์ ์ ๋ถ์ฐ์ํค๋ ๋ฐฉ๋ฒ!!!!!!
(๋ค๋ฅธ์ฐ๋ ๋์์ ๋์์ ์ผํ๊ฒ ๋ง๋ค๊ธฐ ~!)
iOS ํ๋ก๊ทธ๋๋ฐ์์๋ ์์ ์ “๋๊ธฐํ๋ ฌ(Queue)"์ ๋ณด๋ด๊ธฐ๋งํ๋ฉด OS๊ฐ ์์์ ์ฐ๋ ๋์ ๋ถ์ฐ์ฒ๋ฆฌ ํด์ค๋ค.(๊ณ ๋ง๊ณ ๋๋ํ ๋ ์ ...)
๊ทธ๋ฆผ์ ๋ณด๋ฉด Queue๊ฐ ์์์ ์ฐ๋ ๋๋ฅผ ๋ฐฐ์น ํด์คฌ๋ค. ๋จผ์ ๋ค์ด์จ๋ ์์ด ๋จผ์ ๋ฐฐ์น๋๋ค.
ํ์ง๋ง!! ๋จผ์ ๋ฐฐ์น๋๋ค๊ณ ๊ทธ ์์ ์ด ๋จผ์ ๋๋๋ ๊ฒ์ ์๋๋ค.
“์ฐ๋ฆฌ๊ฐ ํ ์ผ์ ์ค์ง ์์ ์ ํ(Queue)๋ก ๋ณด๋ด์ !”
2) ๊ฐ๋จํ GCD/Operation ์๊ฐ
iOS ํ๋ก๊ทธ๋๋ฐ์์ ๋๊ธฐํ๋ ฌ(Queue)์๋ ๋๊ฐ์ง๊ฐ ์๋ค !!
- GCD
- Operation
์ฐ๋ฆฌ๋ ์๋คํํ ์์ ์ ๋ฃ์ด์ฃผ๊ธฐ๋ง ํ๋ฉด ์๋ค๊ฐ ์์์ ๋ถ์ฐ ์ฒ๋ฆฌํด์ฃผ๋ ์ผํจ ..
์์คํ ์ด GCD/Operation์ ๋ณด๊ณ ์์์ ์ฐ๋ ๋ ์ซ์ ๊ด๋ฆฌํ๋ค.
(์ฐ๋ฆฌ๊ฐ ์ง์ ์์ฑํ๋๊ฑฐ๋ณด๋ค ์๋ง ๋ ์ํ ๊ฒ..๊ฑ ์๋ค ์์ผ๋ผ..)
GCD/Operation์ ์ฐ๋ ๋๋ณด๋ค ํ๋จ๊ฒ ๋์ ์ฐจ์์์ ์ผํ๋ฉด์ ์์ ๋ค์ด “๋น๋๊ธฐ์ ์ผ๋ก ๋์ํ๋๋ก” ๋ง๋ค์ด ์ค๋ค~! (์ด๋ค API๋ค์ ๋ด๋ถ์ ์ผ๋ก ๋น๋๊ธฐ์ ์ผ๋ก ์คํ๋๋๋ก ์ค๊ณ๋์ด์์ ์์ ๊ธฐ)
๊ทธ๋ผ ์ด๋ป๊ฒ ํ(GCD/Operation)๋ก ๋ณด๋ด๋๊ฐ !?!
๋ฐฉ๋ฒ 1 ๋๋
DispatchQueue.global().async {
//๋ค๋ฅธ ์ฐ๋ ๋๋ก ๋ณด๋ผ ์์
์ ๋ฐฐ์น
}
๋ฐฉ๋ฒ 2 ๋๋(์ ์ธ ๋จผ์ ํ๋ ๋ฐฉ๋ฒ)
let queue = DispatchQueue.global()
queue.async {
//๋ค๋ฅธ ์ฐ๋ ๋๋ก ๋ณด๋ผ ์์
์ ๋ฐฐ์น
}
async{ task} → ์์ ์ ํ๋จ์์ฉ ๋ค์ด๊ฐ
func secondTask0() -> String {
return "โ
์์
1, "
}
func secondTask1(inString: String) -> String {
return inString + "์์
2, "
}
func secondTask2(inString: String) -> String {
return inString + "์์
3 โ
"
}
// ์์๊ฐ ํ์ํ ์์
์คํํด๋ณด๊ธฐ
DispatchQueue.global().async {
let out0 = secondTask0()
let out1 = secondTask1(inString: out0)
let out2 = secondTask2(inString: out1)
print(out2)
}
์ถ๋ ฅ
โ
์์
1, ์์
2, ์์
3 โ
ํ๋์ async{} ๊ดํธ ์์์๋ ์์๋๋ก ์ฐจ๊ณก์ฐจ๊ณก ์งํ๋จ .
GCD (Grand Central Dispatch : ๋์คํจ์น ํ)
- ๊ฐ๋จํ ์ผ
- ํจ์๋ฅผ ์ฌ์ฉํ๋ ์์ , ํด๋ก์ ธ๋ก ๋ฌถ์ ์์ด๋ค ์์
Operation(: ์คํผ๋ ์ด์ ํ)
- ๋ณต์กํ ์ผ
- ๋ฐ์ดํฐ์ ๊ธฐ๋ฅ์ ์บก์ํํ ๊ฐ์ฒด
๐ก Operation์ GCD๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฌ๋ฌ๊ฐ์ง ๊ธฐ๋ฅ(์ทจ์, ์์์ง์ , ์ผ์์ ์ง ๋ฑ)์ ์ถ๊ฐ ํ์ฌ 2016๋ ๋์ ์ ํ์ด ๋ฐํํ ๊ฐ๋ !!!! ๋ ์ค์ ๊ผญ ๋ญ์จ์ผํ๋๊ฑฐ๋ ์๋ค. ํ๋ก์ ํธ์ ํจ์จ์ฑ, ์ฌ๋ก ์ ํฉ์ฑ์ ๋ฐ๋ผ ์ ํด์ผํ๋์. operation์ ํด๋์ค๋ก ๋ง๋ค์ด์ง ๊ฐ์ฒด๋ผ์ ํ๋ฒ ๋ง๋ค์ด๋์ผ๋ฉด ์ฌ์ฌ์ฉํ๊ธฐ ํธํ๊ธด ํ๋คํจ (์ฌ.)
3)Synchronous(๋๊ธฐ)์ Asynchonous(๋น๋๊ธฐ)์ ์ฐจ์ด
๋น๋๊ธฐ async
- ์์ ์ 2๋ฒ ์ฐ๋ ๋์ ๋ณด๋ด๊ณ ๋์ ์ด ์์ ์ด ๋๋๋๊ฑธ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ 1๋ฒ ์ฐ๋ ๋๋ก ๋ฐ๋ก ๋์์ค๋ ๊ฒ (์ฆ์ ๋ฆฌํด)
- ์ผ์ ์์ ์์ผ๋๊ณ ๊ทธ ์์ ์ด ๋๋ ๋๊น์ง “์ ๊ธฐ๋ค๋ฆฐ๋ค” → ๋ฐ๋ผ์ ๋ฉ์ธ์ฐ๋ ๋(1๋ฒ์ฐ๋ ๋)๊ฐ ๋ฐ๋ก ๋ค๋ฅธ ์ผ์ ์์ ํ ์ ์๋ค.
let queue = DispatchQueue.global()
func task1() {
print("Task 1 ์์")
sleep(1)
print("Task 1 ์๋ฃโ
")
}
func task2() {
print("Task 2 ์์")
print("Task 2 ์๋ฃโ
")
}
func task3() {
print("Task 3 ์์")
sleep(4)
print("Task 3 ์๋ฃโ
")
}
func task4() {
print("Task 4 ์์")
sleep(3)
print("Task 4 ์๋ฃโ
")
}
queue.async {
task1()
}
queue.async {
task2()
}
queue.async {
task3()
}
์ถ๋ ฅ
Task 1 ์์
Task 3 ์์
Task 2 ์์
Task 2 ์๋ฃโ
Task 1 ์๋ฃโ
Task 3 ์๋ฃโ
๋น๋๊ธฐ ์ฒ๋ฆฌ๋ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ฉ์ธ์ฐ๋ ๋๋ก ๋์์์ ๋ค๋ฅธ ์์ ๋ค์ ์์ํ๊ธฐ ๋๋ฌธ์
์ ๊ฐ๊ฐ ์์ํ๊ณ ์ ๊ฐ๊ฐ ๋๋จ
๐ก ๋น๋๊ธฐ๋ผ๋ ๊ฐ๋ ์ด ์ผ๋ฐ์ ์ผ๋ก ํ์ํ ์ด์ ๋?
A : ๋๋ถ๋ถ์ ์๋ฒ์์ ํต์ (๋คํธ์ํฌ ์์ ) ๋๋ฌธ์ด๋ค. (๋คํธ์ํฌ์ ๊ด๋ จ๋ ์์ ๋ค์ ๋ด๋ถ์ ์ผ๋ก ๋น๋๊ธฐ์ ์ผ๋ก ๊ตฌํ ์: URLSession)
4) Serial(์ง๋ ฌ) VS Concurrency(๋์)
Serial๊ณผ Concurrency๋ ํ์ ๋๊ฐ์ง ํน์ฑ ์ข ๋ฅ
Serial Queue (์ง๋ ฌํ) : ๋จ ํ๋์ ๋ค๋ฅธ ์ค๋ ๋๋ก๋ง ๋ณด๋ด๋ ํน์ฑ์ ๊ฐ์ง ๋๊ธฐ์ด. ์์๊ฐ ์ค์ํ ์์ ์ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉ
Concurrentํ (๋์ํ): ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ์ฌ์ฉํด์ ์์ ์ ์ฒ๋ฆฌํ๋ ๊ทธ๋ฐ ํ. ๊ฐ์ ๋ ๋ฆฝ์ ์ด์ง๋ง ์ ์ฌํ ์ฌ๋ฌ๊ฐ์ ์์ ์ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉ
(์์ ๋ฒ๋ฒ ์ด๋ ์์ ๋ ์ ํ๋ํ๋๊ฐ ์๋ฒ์ ์์ฒญํด์ ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ก๋ ๋ฐ๊ณ ํํฐ๋งํ๊ณ ๊ทธ๋ฐ ์์ ๋ค. ์ ํ๋ํ๋๊ฐ ๊ฐ์ ๋ ๋ฆฝ ๋์์ง๋ง ์ ์ฌํ ์์ )
๋น๋๊ธฐ๋ ๋ง๊ณผ ๋์๋ ๋ง์ด ๊ฐ์ ๋ง์ธ๊ฐ? : ์ ํ ๋ค๋ฅธ ๋ง์ด๋ค.
๋น๋๊ธฐ๋ผ๋ ๋ง์ ๋ค๋ฅธ ์ฐ๋ ๋๋ก ๋ถ์ฐ์ฒ๋ฆฌ ์ํค๊ณ ๊ทธ์์ ์ด ๋๋๊ธธ “๊ธฐ๋ค๋ฆฌ์ง ์๋๊ฒ" .
๋์๋ผ๋ ๋ง์ ๋๊ธฐ์ด๋ก ๋ณด๋ด์ง ์์ ์ด “์ฌ๋ฌ๊ฐ์ ์ฐ๋ ๋๋ก ๊ฐ๋ ๊ฒ”
'iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS] addsubview()์ ํ๋ฒ์ ์ฌ๋ฌ subview ์ถ๊ฐํ๊ธฐ (0) | 2023.02.14 |
---|---|
[iOS] Xcode์ Target ์ด๋? (0) | 2023.02.13 |
[iOS] Rx์์ด ๊ตฌํํ๋ MVVM๊ธฐ์ด (0) | 2023.02.09 |
[iOS] UIButton.Configuration ์ฌ์ฉํด๋ณด๊ธฐ (0) | 2023.02.07 |
[iOS] ์ ํ๋ฆฐ์์ Xcode ์ปฌ๋ฌ์์ ๋ฐ๋ก ์ถ์ถ (0) | 2023.02.05 |