
1οΈβ£ μ€λͺ
GCDλ₯Ό μ¬μ©νκΈ° μν λκΈ°μ΄λ‘, GCDκΈ°μ μ μΌλΆGCD (Grand Central Dispatch)
- λ©ν°μ½μ΄ μμ€ν μμ λμμ± μ€νμ μ 곡νλ νλ‘κ·Έλλ° μΈμ΄ μμ, λ°νμ λΌμ΄λΈλ¬λ¦¬ λ±
GCDλDispatchQueueλ³΄λ€ λμ κ°λ GCDλDispatchλΌλ νλ μμν¬μ λμΉμν¬ μ μμ
FIFO(First In, First Out)λ‘ μμ
μ μ²λ¦¬DispatchQueueλ₯Ό 컀μ€ν
ν μ μμ| Serial | Concurrent | |
|---|---|---|
| μ€λ λ μ | λ¨μΌ μ€λ λ | λ€μ€ μ€λ λ |
| attributes | default | .concurrent |
| sync | async |
|---|---|
| λκΈ° | λΉλκΈ° |
Serial DispatchQueueSerialνμλ λ¬λ¦¬ μ±μ΄ μ€νλλ λμμλ λ λ©λͺ¨λ¦¬μ μ¬λΌμ μμmainμ μμ
μ μΆκ°νλ©΄ SerialνμΈ mainμ€λ λμμ μμ
μ μ²λ¦¬Main Thread
- μ±μ μλͺ μ£ΌκΈ°μ κ°μ μλͺ μ£ΌκΈ°λ₯Ό κ°μ§
- μ±μ κΈ°λ³Έμ΄ λλ μ€λ λ
- λ©λͺ¨λ¦¬μ νμ μ¬λΌμ μλ
Defaultμ€λ λ- λμμ± νλ‘κ·Έλλ°μμ λ©μΈ μ€λ λμμλΆν° νμν λ§νΌμ μ€λ λκ° νμλ¨
globalμ€λ λλ€κ³Όλ λ€λ₯΄κ²Run Loopκ° μλμΌλ‘ μ€μ λκ³ μ€ν- λ©μΈ μ€λ λμμ λμνλ
Run Loopλ₯ΌMain Run LoopλΌκ³ ν¨UIμμμ λ©μΈ μ€λ λμμλ§ μμ ν μ μμ
DispatchQueue(label: "Serial")
DispatchQueue.main
main.sync : deadlock(κ΅μ°©μν)μ λΉ μ§κ² λ¨, mainμ€λ λμ Block-waitμ΄ λλκΈ°λ₯Ό κΈ°λ€λ¦¬λ μνκ° λ¨, global().async{}λ‘ κ°μΈμ DispatchQueueμ λμ§λ κ²μ κ°λ₯main.async : DispatchQueueμ μΌλ¨ μμ
μ addν λ€, mainμ€λ λκ° λͺ¨λ μ€νμ΄ λ λ€ μμ
, μμ
μ΄ λλκΈ°λ₯Ό κΈ°λ€λ¦¬μ§ μμConcurrent Queueglobalμ μμ
μ μΆκ°νλ©΄ μλ‘μ΄ μ€λ λλ₯Ό λ§λ€μ΄ κ·Έ μμμ μμ
μ μ²λ¦¬DispatchQueue(label: "Concurrent", attributes: .concurrent)
DispatchQueue.global()
global().sync {} : mainμ€λ λ λ§κ³ μλ‘μ΄ globalμ€λ λλ₯Ό λ§λ€μ΄μ μμ
μ μ²λ¦¬, μμ
μ΄ λλ λκΉμ§ κΈ°λ€λ €μΌν¨(main Treadκ° λ©μΆ°μ κΈ°λ€λ¦Ό)global().async {} : mainμ€λ λ λ§κ³ μλ‘μ΄ globalμ€λ λλ₯Ό λ§λ€μ΄μ μμ
μ μ²λ¦¬ν 건λ°, λ€μ μμ
μ΄ μλ€λ©΄ κΈ°λ€λ¦¬μ§ μκ³ μ²λ¦¬ν¨syncμ asyncλ©μλμ execute νλΌλ―Έν°λ₯Ό ν΅ν΄ μ λ¬νλ©΄ λ¨DispatchQueue.main.async(execute: task)
DispatchQueue.global().sync(excute: task)
asyncλ©μλλ₯Ό μνλ μκ°μ νΈμΆν΄μ€ μ μλ λ©μλprameterdeadline : μ€ν±μμΉλ‘ μΈ‘μ νλ―μ΄ μΉ΄μ΄νΈwallDeadline : μμ€ν
(κΈ°κΈ°)μ μκ°μ κΈ°μ€μΌλ‘ μΉ΄μ΄νΈ.now()μΌλ‘λΆν° 5μ΄ ν taskλ₯Ό μ€νμν¨λ€λ μμ μ½λDispatchQueue.global().asyncAfter(deadline: .now() + 5, execute: task)
DispatchQueue.global().asyncAfter(wallDeadline: .now() + 5, excute: task)
syncμ μ μ¬DispatchQueue.global().asyncAndWait(execute: task)
convenience init(label: String,
qos: DispatchQoS = .unspecified,
attributes: DispatchQueue.Attributes = [],
autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency = .inherit,
target: DispatchQueue? = nil)
1οΈβ£ label
let myDispatchQueue = DispatchQueue(label: "testQueue")
DispatchQueueμ labelμ μ€μ ν΄μ£Όλ νλΌλ―Έν°Stringκ°2οΈβ£ qos
DispatchQoSνμ
μ κ°μ λ°λ νλΌλ―Έν°Taskλ€μ μ°μ μμλ₯Ό μ ν΄μ£Όλ κ°3οΈβ£ attributes
DispatchQueueμ μμ±μ μ ν΄μ£Όλ κ°.concurrentλ‘ μ΄κΈ°ννλ€λ©΄ λ€μ€ μ€λ λ νκ²½.initiallyInactiveλ‘ μ΄κΈ°ννλ€λ©΄ μμ
μ μ΄κ° κ°λ₯, active()λ₯Ό νΈμΆνκΈ° μ κΉμ§λ μμ
μ μ²λ¦¬νμ§ μμ.initiallyInactiveλ₯Ό μ¬μ©ν μ½λ μμlet myDispatch = DispatchQueue(label: "testQueue", attributes: .initiallyInactive)
myDispatch.async(execute: task) // μ½λ λΈλ‘ νΈμΆ μλ¨.
myDispatch.activate()
4οΈβ£ autoreleaseFrequency
DispatchQueueκ° μλμΌλ‘ κ°μ²΄λ₯Ό ν΄μ νλ λΉλμ κ°μ κ²°μ νλ νλΌλ―Έν°autorealeaseν΄μ£Όλ λΉλdefalutλ inheritinherit : targetκ³Ό κ°μ λΉλλ₯Ό κ°μ§workItem: workItemμ΄ μ€νλ λλ§λ€ κ°μ²΄λ€μ ν΄μ never: autoreleaseλ₯Ό νμ§ μμ