- GCD (Grand Central Dispatch) - λμ μ΄λ κ°λ° λ ΈνΈ
- GCDμ λν΄μ μμ보기 (DispathQueue) - λ§κΈ°
- Concurrency Programming Guide - Dispatch Queues - Zedd
- GCD - Dispatch Queueμ¬μ©λ² (1) - Zedd
- Concurrency Programming Guide - DispatchQueue
μ½κ³ νΈν λ©ν° μ€λ λ©μ μ²λ¦¬λ₯Ό μν΄ Appleμμλ λκ°μ§ APIλ₯Ό μ 곡νλ€.
- GCD(Grand Central Dispatch) - CκΈ°λ°μ μ μμ€ API
- NSOperation - Obj-CκΈ°λ°μ κ³ μμ€ API
- GCDλ³΄λ€ μ½κ°μ μ€λ²ν€λ λ°μ λ° λλ¦° μλλ₯Ό κ°κ³ μμ§λ§ GCDμμ μ§μ μ²λ¦¬ν΄μΌνλ μμ (KVOκ΄μ°°, μμ μ·¨μ λ±)μ μ§μνκ³ μκΈ°μ κ°μνκ³ μ¬μ©ν λ§ ν¨
κ·Έ μ€μμ GCDμλ DispatchQueueλΌλ ν΄λμ€κ° μ‘΄μ¬νλ€. κ·Έλ¦¬κ³ μ΄ ν΄λμ€λ μ€μ λ‘ ν΄μΌν Taskλ₯Ό λ΄μλλ©΄ μ νλ μ€λ λμμ μ€νμ ν΄μ£Όλ μν μ νλ€.
DispatchQueue
Serial/Concurrentμ sync/asyncλ λ³κ°μ κ°λ μ΄λ€
-
μ’ λ₯
Serial Dispatch Queue
- Serial Queueλ λ±λ‘λ μμ μ νλ²μ νλμ© μ°¨λ‘λλ‘ μ²λ¦¬
- μ²λ¦¬μ€μΈ μμ μ΄ μλ£λλ©΄ λ€μ μμ μ μ²λ¦¬
Concurrent Dispatch Queue
- Concurrent Queueλ λ±λ‘λ μμ μ νλ²μ νλμ© μ²λ¦¬ νμ§ μκ³ μ¬λ¬ μμ λ€μ λμμ μ²λ¦¬
-
λ©μλ
sync
- λκΈ°μ²λ¦¬ λ©μλ
- νμ μμ μ μΆκ°νμΌλ©΄ κ·Έκ² λλ λκΉμ§ βκΈ°λ€λ¦¬λβ κ²(μΈνκΈ° λλ €λκ³ λ€ λμκ°λκΉμ§ μ€μ§)
async
- λΉλκΈ°μ²λ¦¬ λ©μλ
- νμ μμ μ μΆκ°ν λ€, κΈ°λ€λ¦¬λκ²λ μκ³ κ·Έλ₯ λ€λ₯Έ μμ μ λ°λ‘ ν μ μλ κ²(μΈνκΈ° λλ €λκ³ μ± μ½λ κ²)
μ± μ€νμ μμ€ν μμ κΈ°λ³Έμ μΌλ‘ 2κ°μ Queueλ₯Ό λ§λ€μ΄μ€λ€.
let wsQueue = DispatchQueue(label: "ws") μ΄λ°μμΌλ‘ 컀μ€ν ν μμ±λ κ°λ₯νλ€
main queue
- λ©μΈ μ€λ λ(UI μ€λ λ)μμ μ¬μ© λλ
Serial Queue
- λͺ¨λ UI μ²λ¦¬λ λ©μΈ μ€λ λμμ μ²λ¦¬ν΄μΌ ν¨
- λ©μΈ μ€λ λ(UI μ€λ λ)μμ μ¬μ© λλ
global queue
- νΈμμ μ¬μ©ν μ μκ² λ§λ€μ΄ λμ
Concurrent Queue
- Global Queueλ μ²λ¦¬ μ°μ μμλ₯Ό μν qos(Quality of service) νλΌλ―Έν°λ₯Ό μ 곡
- λ³λ ¬μ μΌλ‘ λμμ μ²λ¦¬λ₯Ό νκΈ°λλ¬Έμ μμ μλ£μ μμλ μ ν μ μμ§λ§ μ°μ μ μΌλ‘ μΌμ μ²λ¦¬νκ² ν μ μλ€
- νΈμμ μ¬μ©ν μ μκ² λ§λ€μ΄ λμ
Concurrent && sync
// MARK: - Concurrent && sync DispatchQueue.global().sync { for i in 1...5 { print(i) } print("==================") } for i in 100...105 { print(i) } print("==================")
- result
νκ° Concurrentμ΄κΈ΄ νμ§λ§ syncμ΄κΈ°λλ¬Έμ μμ°¨μ μΌλ‘ μ€νλλ€.
1 2 3 4 5 ================== 100 101 102 103 104 105 ==================
- result
Serial && sync
// MARK: - Serial && sync let wsQueue = DispatchQueue(label: "ws") wsQueue.sync { for i in 1...5 { print(i) } print("==================") } for i in 100...105 { print(i) } print("==================")
- result
Concurrent && sync μ κ²°κ³Όκ° κ°λ€.
1 2 3 4 5 ================== 100 101 102 103 104 105 ==================
- result
Concurrent && async
// MARK: - Concurrent && async DispatchQueue.global().async { for i in 1...5 { print("\(i)π") } print("==================") } DispatchQueue.global().async { for i in 200...205 { print("\(i)π₯") } print("==================") } for i in 100...105 { print("\(i)π»") }
- result
μ€νμλ§λ€ μμλ λ€λ₯΄λ€.
asyncμ΄λ©° νλ Concurrentμ΄λ―λ‘ λμλ€λ°μ μΌλ‘ μ½λκ° μ€νλλ€.100π» 200π₯ 1π 101π» 201π₯ 2π 102π» 202π₯ 203π₯ 3π 204π₯ 103π» 4π 205π₯ ================== 5π ================== 104π» 105π»
- result
Serial && async
// MARK: - Serial && async wsQueue.async { for i in 1...5 { print("\(i)π") } print("==================") } wsQueue.async { for i in 200...205 { print("\(i)π₯") } print("==================") } for i in 100...105 { print("\(i)π»") }
- result
μ€νμλ§λ€ μμλ λ€λ₯΄λ€.
asyncμ΄κΈ° λλ¬Έμ π»μ΄λμ κ°μ΄ λμ€μ§λ§ νκ° Serialμ΄λ―λ‘ λ¬΄μ‘°κ±΄ πμ΄ λλμΌ π₯μ΄ λμ¨λ€.100π» 101π» 102π» 1π 103π» 2π 3π 4π 5π ================== 104π» 105π» 200π₯ 201π₯ 202π₯ 203π₯ 204π₯ 205π₯ ==================
- result
-
GCD μ΄μ μ λ©ν° μ€λ λ©
λ©ν° μ½μ΄ νλ‘μΈμμμλ νλ‘κ·Έλ¨μ λμμ λ©ν° νλ‘μΈμμκ² μ΄λ»κ² μ λ°°λΆνλμ§κ° μ€μνλ€.
GCD μ΄μ μλ λ©ν° μ€λ λ©μ μν΄ Threadμ OperationQueue λ±μ ν΄λμ€λ₯Ό μ¬μ©νλλ°, Threadλ 볡μ‘ν λΏλ§ μλλΌ μκ³ κ΅¬μ (Critical Section) λ±μ μ΄μ©ν Lockμ κ΄λ¦¬νκΈ° κΉλ€λ‘μ λ€. κ·Έλ¦¬κ³ OperationQueueλ GCDμ λΉν΄ 무κ²κ³ Boilerplate Codeλ€μ΄ λ§μ΄ νμν λ¬Έμ κ° μμλ€. -
GCDμ λ±μ₯
κ·Έλμ Appleμ GCDλ₯Ό λ΄λκ²λλ€.
GCDλ λ©ν° μ½μ΄ νλ‘μΈμ μμ€ν μ λν μμ© νλ‘κ·Έλ¨ μ§μμ μ΅μ ννκΈ° μν΄ Appleμμ κ°λ°ν κΈ°μ λ‘, μ€λ λ κ΄λ¦¬μ μ€νμ λν μ± μμ μ ν리μΌμ΄μ λ 벨μμ μ΄μ체μ λ λ²¨λ‘ λ겨λ²λ¦°λ€. GCDμ μμ λ¨μλ Block(Swiftμμλ ν΄λ‘μ Έ)λΌκ³ λΆλ¦¬λ©°, DispatchQueueκ° μ΄ Blockλ€μ κ΄λ¦¬νλ€.
GCDλ κ° μ ν리μΌμ΄μ μμ μμ±λ DispatchQueueλ₯Ό μ½λ λ©ν°μ½μ΄ μ€νμμ§μ κ°μ§κ³ μλλ°, μ΄κ²μ΄ Queueμ λ±λ‘λ κ° μμ λ€μ κΊΌλ΄μ μ€λ λμ ν λΉν΄μ€λ€. κ·Έλ κΈ° λλ¬Έμ κ°λ°μλ λ΄λΆ λμμ μμΈν μ νμμμ΄ Queueμ μμ μ λκΈ°κΈ°λ§ νλ©΄ λμ΄μ, Threadλ₯Ό μ§μ μμ±νκ³ κ΄λ¦¬νλ κ²μ λΉν΄ κ΄λ¦¬λ μ©μ΄νκ³ μ±λ₯ λ©΄μμλ μ’μ κ²°κ³Όλ₯Ό μ»μ μ μλ€.
μ΄κ²μ΄ GCDκ° νμν μ΄μ μ΄λ€.