-
[iOS] DispatchQueue.main.sync { } ๋ ์ด๋ป๊ฒ ์๋ํ ๊น?iOS/๐ค App 2021. 6. 7. 15:27
์ ์์ง์ : [iOS] GCD๋?
์๋ ํ์ธ์๐ถ
์ด๋ฒ ์๊ฐ์๋ GCD ๋ฅผ ์ฒ์ ๊ณต๋ถํ ๋
์ฝ๊ฒ์ดํด๊ฐ์ง ์์๋DispatchQueue.main.sync { } ์ ๋์๋ฐฉ์์ ๋ํด ๋ค๋ค๋ณด๋ ค๊ณ ํฉ๋๋ค.
StackOverflow ์์ main ์ฐ๋ ๋์ sync ๋ฅผ ์ ๋ฌํ๋ฉด ์ฑ์ด ๊ฐ์ ์ข ๋ฃ ๋๋ ์ด์ ๋ฅผ ์ฐพ์๋ณด๋ฉด,
`Main queue์ sync๋ก Task๋ฅผ ์ ๋ฌํ๋ฉด Deadlock ์ด ๊ฑธ๋ฆฐ๋ค` ์ ๋์ ๋ชจํธํ ์ด์ผ๊ธฐ๋ง ๋์์์ด์ ์ ๋๋ก๋ ์ด์ ๋ฅผ ์๊ณ ์ถ์ด์ ํ๋ฒ ์์๋ณด๊ฒ ๋์์ต๋๋ค.
์์ ๊ฐ์ด ์ง์ ์์ฑํ User Code ์์ DispatchQueue.main.sync(block:) ์ ํธ์ถํ๋ฉด ์ฑ์ ํฌ๋์๊ฐ ๋ฐ์ํ๊ณ ๊ฐ์ ์ข ๋ฃ ๋ฉ๋๋ค.
์ด๋ฒ ๊ธ์ ์ด ํ์์ด ์ ๋ฐ์ํ๊ฒ ๋๋์ง ์์๋ณด๋ ๊ธ์ ๋๋ค.
๊ฒฐ๋ก ์ ์ฐ์ ๋ง์๋๋ฆฌ๋ฉด
์์ง ๋ฐํ๋์ง ์์ Task ๊ฐ ์๋ SerialQueue ์ ๋๊ธฐ์ ์ผ๋ก Task๋ฅผ ์ ๋ฌํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ฐ์ ๋ ๊ฐ์ง ์ฌ์ค์ ๋จผ์ ์ดํดํ๋ฉด ์์ํ ๊ฒ ๊ฐ์ต๋๋ค.
1. sync ์ async
DispatchQueue.main.sync(block:),
DispatchQueue.global().async(block:) ์ ๋ ๋ฉ์๋๋ฅผ ๋น๊ตํ๋ฉฐ ์์๋ฅผ ๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
๊ณตํต์
DispatchQueue.main.sync(block:),
DispatchQueue.global().async(block:) ์ ๊ฐ์ ๋ฉ์๋๋ค์
ํ๊ฒ Queue ์ Task๋ฅผ ์ถ๊ฐ๋ง ํฉ๋๋ค.
:: ์ฌ๊ธฐ์ ํ์ผ Queue ๋ Task ๊ฐ ์ถ๊ฐ๋๋ Dispatch Queue ๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
์๋ฅผ ๋ค์ด DispatchQueue.main.sync(block:) ๋ Main queue ์ ๋๊ธฐ์ ์ผ๋ก Task๋ฅผ ์ถ๊ฐํฉ๋๋ค.
DispatchQueue.global().async(block:) ๋ Global queue ์ ๋น๋๊ธฐ์ ์ผ๋ก Task๋ฅผ ์ถ๊ฐํฉ๋๋ค.
Task๋ฅผ ์ฐ๋ ๋์ ๋ฐฐ์ ํ์ฌ ์คํ์ํค๋ ๊ฒ์ GCD์ ์ญํ ์ ๋๋ค.
์ฐจ์ด์ : ๋ฐํ ์์ ๊ณผ ์๋ฃ ์์
์ฐ์ async ๋ก ์ ๋ฌํ ๊ฒฝ์ฐ, ๋น๋๊ธฐ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ Task๋ฅผ ํ๊ฒ ํ์ ์ถ๊ฐ๋ง ํด๋๊ณ DispatchQueue.global().async(block:) ๋ ๋ฐ๋ก ๋ฐํ๋ฉ๋๋ค.
์ดํ ์ถ๊ฐ๋ Task๋ GCD๊ฐ ์์์ ์ฐ๋ ๋์ ๋ฐฐ์ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ ํํ ์คํ ์์ ์ ์ ์ ์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ sync ๋ก ์ ๋ฌํ ๊ฒฝ์ฐ, ๋๊ธฐ๋ฐฉ์์ผ๋ก ์ํ๋์ด์ผํ๊ธฐ ๋๋ฌธ์ ํ์ ์ถ๊ฐ๋ ์ฆ์ GCD Task๋ฅผ ์ฐ๋ ๋์ ๋ฐฐ์ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ํ์ ์๋ฃํ๊ธฐ ์ ๊น์ง ํ๊ฒ ํ์ ๋๋จธ์ง Task์ ๋ฝ์ ๊ฑธ๊ณ , ๋ฐํํ์ง ์์ต๋๋ค. ์๋์ ์ค๋ช ๐๐ป๐๐ป๐๐ป)
GCD๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๋ฉ์ธ ํ์ ์ถ๊ฐ๋๋ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๋ฉด, ์ฐ๋ฆฌ๊ฐ Task๋ฅผ ์คํํ ์ฐ๋ ๋๋ฅผ ์ง์ ์ง์ ํ ์ ์์ต๋๋ค
2. ๋ฝ์ด ๊ฑธ๋ฆฐ DispatchQueue ์ ๋์
Task๋ฅผ ๋๊ธฐ์ ์ผ๋ก(sync) ์ ๋ฌํ๋ฉด GCD ๋ ์ฐ๋ ๋์ Task ๋ฅผ ์ฆ์ ๋ฐฐ์ ํ๊ณ ๋ฐํ๋๊ธฐ ์ ๊น์ง ํ๊ฒ ํ์ ๋ฝ์ ๊ฒ๋๋ค.
๋ฝ์ ๊ฑธ๋ฉด Queue ๋ด์ ๋๋จธ์ง Task๋ ๋ชจ๋ ์ ์ง ์ํ๊ฐ ๋ฉ๋๋ค. (= ์ค๋ ๋๋ฅผ ๋ฐฐ์ ๋ฐ์ ์ ์์ต๋๋ค.)
ํด๋น Task ๊ฐ ๋ฐํํ ๋๊น์ง Queue๋ ๋ฝ์ด ํด์ ๋์ง ์์ต๋๋ค.
์ด์ ์๋์ ์ฝ๋์์ ๋ธ๋ ์ดํฌ ํฌ์ธํธ๋ฅผ ์ถ๊ฐํ๊ณ ์คํํ๋ฉฐ ํ์ ์ฐ๋ ๋์ ์ํฉ์ ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
์์ ์์ ์ start(_:) ๋ฉ์๋๊ฐ ํธ์ถ๋ ์งํ ์ ๋๋ค.
์ด ๋ ๋ฉ์ธ ์ฐ๋ ๋ (Thread 1) ์ ์คํ ํ๋ ์์ ๋ณด๋ฉด start(_:) ๊ฐ ์ํ ์ค์์ ํ์ธํ ์ ์์ต๋๋ค.
์์ง ๋ฐํ๋์ง ์์์ผ๋ฏ๋ก, serial queue ์ธ main queue์์ ๋ค๋ฅธ Task ๋ ์ ๋๋ก ์ํ๋ ์ ์์ต๋๋ค.
์ด ๋ start(_:) ๋ฉ์๋์์ DispatchQueue.main.sync { print("Im main sync" } (์ดํ sync block) ๋ฅผ ํธ์ถํ๋ฉด sync block ๋ฐํ๋๊ธฐ ์ ๊น์ง ์ ์ด๊ฐ start(_:)๋ก ๋ค์ ๋์ด๊ฐ์ง ์์ต๋๋ค. ๋๊ธฐ ๋ฐฉ์์ผ๋ก ์ ๋ฌํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ฌธ์ ๋ ์ฌ๊ธฐ์ ๋ฐ์ํฉ๋๋ค.๋ฉ์ธํ๋ Serial Queue ์ด๊ธฐ ๋๋ฌธ์, ๋จผ์ ์ํ๋ start(_:) ๊ฐ ๋จผ์ ๋ฐํ๋์ด์ผ ๋ค์ Task ์ธ sync block์ ์ํํ ์ ์์ฃ ?
๊ทธ๋ฐ๋ฐ ํ๊ฒ ํ์ lock์ด ๊ฑธ๋ ธ๊ธฐ ๋๋ฌธ์ ๋ ์ด์ ์์ ์ด ์งํ๋ ์๊ฐ ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ Main queue ๊ฐ Serial Queue ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋๊ฒ์ผ๋ก, Concurrent queue ์์๋ ์ถ๊ฐ๋ Task๊ฐ ๋ฐํ๋๊ธฐ ์ ๊น์ง ์ด์ ์ Task๋ฅผ ๋ธ๋ฝํ๋ ๊ฒ์ด ๋ฌธ์ ๋์ง ์์ต๋๋ค.
Serial queue์ ๋ฌ๋ฆฌ Concurrent queue๋ ์คํ์์์ ๋ฐํ ์์๊ฐ ์ ํด์ ธ์์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด Main queue์ ์ํ์ค์ธ Task๊ฐ ์๋ค๋ฉด
Task๋ฅผ ๋๊ธฐ๋ก ์ ๋ฌํ์ฌ๋ ๋ฐ๋๋ฝ์ ๋ฐ์ํ์ง ์์๊น?
์ ๊ฐ ํ์ธํ ๊ฒฐ๊ณผ๋ ๋ฐ์ํ์ง ์์๋ค๋ ๊ฒ์ ๋๋ค.
๋ค์ ์์๋ก ํ์ธํด ๋ณผ๊ฒ์!!
์์ ์์ ์ ์ฌ์ฉ์๊ฐ UIButton์ผ๋ก .touchUPInside ์ด๋ฒคํธ๋ฅผ ๋ฐ์์์ผ์ start(_:) ๋ฉ์๋๊ฐ ํธ์ถ๋ ์ํฉ์ ๋๋ค.
๋ธ๋ ์ดํฌ ํฌ์ธํธ 32๋ผ์ธ์์ async(block:)๋ ๊ธ๋ก๋ฒ ํ์ Task๋ฅผ ์ถ๊ฐํ๊ณ ์ฆ์ ๋ฐํ๋๊ณ , start(_:) ๋ก ์ ์ด๊ฐ ๋์ด๊ฐ๋๋ค. ์ดํ start(_:) ๋ ๋ฐ๋ก ๋ฐํ๋๊ธฐ ๋๋ฌธ์ Main queue ์์๋ ๋ ์ด์ ์ํ์ค์ธ Task ๊ฐ ์์ต๋๋ค.
(๋ค๋ฅธ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ง ์์๋ค๋ ๊ฐ์ ํ์)
๋ธ๋ ์ดํฌ ํฌ์ธํธ 33๋ผ์ธ์์, ์ด์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฐ๋ ๋์์ ๊ธ๋ก๋ฒ ํ์ ์ถ๊ฐ๋ ๋ธ๋ญ (Task)์ ์ํํฉ๋๋ค.
// ๊ธ๋ก๋ฒ ํ์ ์ถ๊ฐ๋ ๋ธ๋ญ (Task) { DispatchQueue.main.sync { print("Im in main sync") } }
๊ทธ ๋ธ๋ญ์ ์ํ ๋ด์ฉ์ Main queue์ ๋๊ธฐ์ ์ผ๋ก { print("Im in main sync") } ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค.
์๋ ์ฌ์ง์ ๋ณด์๋ฉด, Thread 1์ ์คํ์์ ์ํํ๊ณ ์๋ Task๊ฐ ์๊ธฐ ๋๋ฌธ์, ๋๊ธฐ๋ก ์ ๋ฌํด๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
๋จผ์ ๋ฐํ๋์ด์ผํ Task๊ฐ ์๊ธฐ ๋๋ฌธ์, ๋ฐ๋ก ์คํํ๊ณ ๋ฐํํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
:: ๋ฉ์ธ ์ฐ๋ ๋์์ ํญ์ ์คํ๋๋ main ์ด ์๋๋ฐ, ์ด๊ฒ์ ๋ฐ๋ก ๊ธ๋ก ์์ฑํด๋ณด๋ ค๊ณ ํฉ๋๋ค. Debug navigator์ ์๋ ์ ์ ์ ์๋ฏธ๋ ์์ง ์ฐพ์๋ด์ง๋ ๋ชปํ์ต๋๋ค.
:: Debug navigator์ ์์ด์ฝ์ ๋ชจ์๋ณ๋ก ์๋ฏธ๊ฐ ๋ค๋ฆ ๋๋ค. ์๋ฅผ ๋ค์ด ์ฌ๋ ๋ชจ์์ ์์ด์ฝ์ User Code๋ฅผ ์๋ฏธํ๊ณ ๋ณด๋ผ์ ์ปต ์์ด์ฝ์ UIKit, AppKit ์ฝ๋์์ ์๋ฏธํฉ๋๋ค.
๋!
'iOS > ๐ค App' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS] Dependency Injection (์์กด์ฑ ์ฃผ์ ) ์ด๋? (0) 2021.06.20 [iOS] About App Development with UIKit (UIKit ์ผ๋ก ์ฑ ๊ฐ๋ฐํ๊ธฐ) (0) 2021.06.16 [iOS] GCD (Grand Central Dispatch) ๋? (feat. main & global dispatch queue) (0) 2021.06.07 [iOS] KVO ๋? (Key Value Observing) (0) 2021.05.22 [iOS] - Cocoa Touch ์์ JSON ๋ค๋ฃจ๊ธฐ (0) 2021.05.07