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 DispatchQueue
Serial
νμλ λ¬λ¦¬ μ±μ΄ μ€νλλ λμμλ λ λ©λͺ¨λ¦¬μ μ¬λΌμ μμ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 Queue
global
μ μμ
μ μΆκ°νλ©΄ μλ‘μ΄ μ€λ λλ₯Ό λ§λ€μ΄ κ·Έ μμμ μμ
μ μ²λ¦¬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
λ©μλλ₯Ό μνλ μκ°μ νΈμΆν΄μ€ μ μλ λ©μλprameter
deadline
: μ€ν±μμΉλ‘ μΈ‘μ νλ―μ΄ μΉ΄μ΄νΈ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
λ inherit
inherit
: target
κ³Ό κ°μ λΉλλ₯Ό κ°μ§workItem
: workItem
μ΄ μ€νλ λλ§λ€ κ°μ²΄λ€μ ν΄μ never
: autorelease
λ₯Ό νμ§ μμ