-
[iOS] GCD (Grand Central Dispatch) λ? (feat. main & global dispatch queue)iOS/π€ App 2021. 6. 7. 00:19
μλ νμΈμ. μ€λμ iOSμ λμμ± νλ‘κ·Έλλ°μ μμ£Ό μ¬μ©νλ GCD μ λν΄μ 곡λΆνκ² μ΅λλ€πΆ
κ·ΈλΌ μμν΄λ³Όκ²μπ₯³
GCD
GCD λ iOS μμ λ©ν°μ½μ΄ νλ‘μΈμμ μ½λλ₯Ό λμμ μ€νμν€κ² ν΄μ£Όλ νλ μμν¬μ λλ€.
:: κ·Έλ¦¬κ³ macOS, watchOS, tvOS μμλ μ¬μ©ν©λλ€.
GCD μμλ νλμ μμ λ¨μμΈ Task λ₯Ό Dispatch Queue μ μ λ¬νκΈ°λ§ νλ©΄ λλ¨Έμ§λ μμ€ν μ΄ μμμ μ²λ¦¬νκ³ μ€νμμΌ μ€λλ€.
Task μ λ¨μλ λΈλ‘μ΄λ, DispatchWorkItem μ μΈμ€ν΄μ€ ννλ‘ μ‘΄μ¬ν©λλ€.
:: λΈλ‘μ `{ }` λ‘ κ°μΈμ§ μ€ν μ½λ
BSD νμ μμ€ν μ΄λ, Core Foundation, Cocoa APIλ€μ μ΄ νλ μμν¬λ₯Ό μ¬μ©ν¨μΌλ‘μ μμ€ν κ³Ό μ ν리μΌμ΄μ μ μ€νμλ, ν¨μ¨μ± κ·Έλ¦¬κ³ λ°μμ±μ ν₯μμμΌ°μ΅λλ€.
μ ν리μΌμ΄μ μ΄ μνλλ μ€ν νκ²½ ( νλ‘μΈμμ μ½μ΄ μ) λ μ κ°κ°μ΄κ³ , λμμ μ€ν μ€μΈ λ€λ₯Έ μ΄ν리μΌμ΄μ κ³Ό μμ κ²½μμ ν΄μΌνκΈ° λλ¬Έμ, νλμ μ΄ν리μΌμ΄μ μ΄ λ€μμ μ½μ΄λ₯Ό ν¨μ¨μ μΌλ‘ μ¬μ©νλκ²μ μ λ§ μ΄λ €μ΄ μμ μ λλ€π
νμ§λ§ μμ€ν λ 벨μμ ꡬλλλ GCD λ₯Ό μ¬μ©νλ©΄, νμ¬ κ΅¬λ μ€μΈ λͺ¨λ μ΄ν리μΌμ΄μ μ μꡬμ¬νμ μ½κ³ λ μ μΆ©μ‘±μν¬μ μμ΅λλ€.
GCD λ μ μ νκ³ κ· νμκ² κ°μ©ν μμ€ν μμμ μ΄ν리μΌμ΄μ μ λΆλ°°νκΈ° λλ¬Έμ λλ€.μμ½: GCD μ Task λ§ μ λ¬νλ©΄ μμμ μ°λ λ λ°°μ μ ν΄μ μ€νμμΌμ€λ€. π―
GCD μμ Queue λ FIFO ννμ΄λ©°, GCD λ Queue μ μ λ¬λ Task μ μ°λ λλ₯Ό Queue μ νΉμ±μ λ§κ² λ°°μ ν©λλ€.
DispatchQueue ν΄λμ€μμ Task λ₯Ό μ λ¬μν¬ Queue λ₯Ό κΈ°λ³Έμ μΌλ‘ λ μ’ λ₯ κ΄λ¦¬ν©λλ€.
DispatchQueue λ λ©μΈ μ°λ λλ λ°±κ·ΈλΌμ΄λ μ°λ λμμ Task λ₯Ό μμ°¨μ μΌλ‘ ( serially ) νΉμ λμμ (concurrently) μ€νμν€λ μ€λΈμ νΈ μ λλ€.
Main queue (λ©μΈ ν)
κ·Έ μ€ νλλ Main queue λ‘μ ꡬλλλ νλ‘μΈμ€(= μ±)μ λ©μΈ μ°λ λμ κ΄λ ¨λ dispatch queue μ λλ€.
π‘ Main queue μ μ λ¬λ Task λ νμ Main Thread μ μν΄ μνλ©λλ€.
μ΄ λΆλΆμμ λ Όλ¦¬μ μ€λ₯μ λΉ μ§μλ μλλ°, global queue μ μ λ¬λ task λ λ©μΈμ°λ λμμ μ€νλ μ μμ΅λλ€.
:: μ΄ μν©μ syncλΌλ λ©μλμ μ±λ₯ μ΅μ ν λλ¬ΈμΈλ°, μν© νλ¨μ GCD κ° ν©λλ€.
Main queueλ νμ μμ± main μΌλ‘ μ κ·Όν μ μμΌλ©° Serial Queue μ λλ€.
μ¦ νλμ Task κ° λ°ν(μλ£) λμ΄μΌ κ·Έ λ€μ μμμ Task λ₯Ό μ€νμν΅λλ€.
// λ©μΈ νμ λκΈ° λ°©μμΌλ‘ λΈλ‘μ μ λ¬νλ μ½λ DispatchQueue.main.sync { print("Hello, world!") } // λ©μΈ νμ λΉλκΈ° λ°©μμΌλ‘ λΈλ‘μ μ λ¬νλ μ½λ DispatchQueue.main.async { print("Hello, world!") }
μ΄ λΆλΆμ 곡λΆνλ©΄μ μ λ§ ν·κ°λ¦¬λ μ
λ°λ‘ μλ¦¬μΌ νμ λκΈ°/ λΉλκΈ° λ°©μμΌλ‘ Task λ₯Ό μΆκ°νλ κ²μ΄ λͺ¨λ κ°λ₯νλ€λ κ²μ μ΄ν΄νλ κ²μ΄ μ΄λ €μ μ΅λλ€.
μλ¦¬μΌ νλ λ¨Όμ λ€μ΄μ¨ Task λ₯Ό λ¨Όμ μνν΄μ λ°νν λ€μ Task λ₯Ό μννλ€λ κ²μ λνλ λλ€.
λκΈ° λ°©μμ Taskμ μνμ΄ μλ£λκΈ° μ κΉμ§ νκ² νμ λ½μ κ±°λ (λΈλ½νλ) κ² μ λλ€.
λκΈ°λ critical section μ λν μ§μ μ λ μ ν¨μΌλ‘μ Race Condition μ λ°©μ§νλ κ²μ΄ κ·Έ 첫λ²μ§Έ λͺ©μ μ΄κΈ° λλ¬Έμ λλ€.
:: λ°λ©΄μ λΉλκΈ° λ°©μμ Taskμ μν μλ£λ₯Ό κΈ°λ€λ¦¬μ§ μκ³ νΈμΆ μ¦μ λ°νλ©λλ€.
κ·Έλμ λ©μΈνμ μ΄λ―Έ μν μ€μΈ λΈλ½μ΄μλ μνμμ DispatchQueu.main.sync { } μ νΈμΆνμ¬ Task λ₯Ό μ λ¬νλ©΄, Deadlock μ΄ λ°μν©λλ€.
λ°λλ‘ μν μ€μΈ Task κ° μλ€λ©΄, λκΈ°λ‘ μ λ¬ν΄λ λ¬Έμ κ° μμ΅λλ€.
μ κ²½μ°μ λν μμλ λ°λ‘ κΈμ μμ±νμ¬ κ²μνκ² μ΅λλ€π
κ΄λ ¨ κΈ: [iOS] DispatchQueue.main.sync { } λ μ΄λ»κ² μλν κΉ?
Global queue (κΈλ‘λ² ν)
Task λ₯Ό Qos μμ€μ μ§μ ν Global dispatch queue μ μΆκ°νλ©΄, GCD λ μ°λ λ νμμ κ°μ©ν λ°±κ·ΈλΌμ΄λ μ°λ λμ Task λ₯Ό ν λΉ ν©λλ€.
Global queue μ μΆκ°λ Task λ€μ concurrently νκ² μνλ©λλ€.
:: Main queue λ serially
μνμκ°μ΄ μ€λ걸리λ μμ λ€μ λ°λμ λ©μΈ νκ° μλ λ°±κ·ΈλΌμ΄λ μ°λ λλ₯Ό μ¬μ©νλ νμμ μ€νμμΌμΌν©λλ€.
:: λ€νΈμν¬, νμΌ μ²λ¦¬ λ±
// κΈλ‘λ² νμ λκΈ° λ°©μμΌλ‘ λΈλ‘μ μ λ¬νλ μ½λ DispatchQueue.global().sync { print("Hello, Global queue!") } // κΈλ‘λ² νμ λΉλκΈ° λ°©μμΌλ‘ λΈλ‘μ μ λ¬νλ μ½λ DispatchQueue.global().async { print("Hello, Global queue!") }
μ μ¬μ§μ XCodeμ Degug Navigatior μμ Process view λΆλΆμ μΊ‘μ²ν μ¬μ§μ λλ€.
μμ κ°μ κ²½μ°μμ Global queueμ Taskλ₯Ό μΆκ°νλ€λ©΄, GCDλ Thread 1 (λ©μΈ μ°λ λ) λ₯Ό μ μΈν κ°μ©ν λ°±κ·ΈλΌμ΄λ μ°λ λ (Thread 2, 4, 8) μ Task λ₯Ό ν λΉν©λλ€.
μ΄ μ°λ λμ κ°μλ μ± μ€ν μμ μ λ°λΌ λ€λ¦ λλ€.
μΆκ°μ μΌλ‘ 리λ§μΈλ νκΈ°
λκΈ°μ μΌλ‘ Task κ° μ λ¬λλ©΄ μ λ¬ μ¦μ μ€νμ μλνλ€. ( μλνλ€? μ€ν¨νλ κ²½μ°λ μκΈ° λλ¬Έ )
μ λ¬λ Task κ° μ€νλμ΄ λ°νλ λκΉμ§ νκ² ν λ΄μ λͺ¨λ Task μ μ€νμ λ©μΆλ€. ( = μ°λ λ λ°°μ μ€μ§)
λΉλκΈ°μ μΌλ‘ Task κ° μ λ¬λλ©΄ Task μ μ€νμμ μ GCD κ° κ²°μ νλ€.
μ λ κ°μ§ μ¬μ€μ Serial Queue μ Concurrent Queueμ μ μ©ν΄λ³΄κ³ , μ΄λ»κ² μλν μ§ μκ°ν΄λ³΄μκΈ° λ°λλλ€.
sync λ©μλλ κ°λ₯ν κ²½μ° μ λ¬λ Task λ₯Ό νμ¬ μ€ν μ€μΈ μ°λ λμμ μ€ννλ€.
μλ₯Ό λ€μ΄ DispatchQueue.global().sync { } λ₯Ό μ λ¬νλ©΄ κ°λ₯ν κ²½μ° Main Thread μμλ μ€νλ μ μμ΅λλ€.
λ!
π€π’[μ°μ§±μ iOS λΈλ‘κ·Έ]π΅π»
iOSλ₯Ό 곡λΆνλ©΄μ λ°°μ΄ λ΄μ©μ κΈ°λ‘νκ³ μμ΅λλ€.μ°Έκ³ μλ£: https://developer.apple.com/documentation/dispatch?changes=latest_minor
μ°Έκ³ μλ£: https://developer.apple.com/documentation/dispatch/dispatchqueue?changes=latest_minor
'iOS > π€ App' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[iOS] About App Development with UIKit (UIKit μΌλ‘ μ± κ°λ°νκΈ°) (0) 2021.06.16 [iOS] DispatchQueue.main.sync { } λ μ΄λ»κ² μλν κΉ? (0) 2021.06.07 [iOS] KVO λ? (Key Value Observing) (0) 2021.05.22 [iOS] - Cocoa Touch μμ JSON λ€λ£¨κΈ° (0) 2021.05.07 'νμκΈ λνΉ μ±'μ μ μνλ©΄μ λ°°μ΄ μ νκ³ (0) 2021.03.05