๐ GCD ( Grand Central Dispatch) ๋?
๋ค์์ Thread์ ์ ์ ํ๊ฒ ์์ ์ ๋ถ๋ฐฐํ๊ธฐ ์ํด ํด์ผ ํ ์ผ์ ๋ฌด์์ผ๊น ?
๋ฐ๋ก ํ ์ผ(task)๋ฅผ Queue์ ๋ฃ๋ ๊ฒ์ด๋ค.
๋ฃ์ด์ผ ๋๋ ๊ฒ์ด๋ผ๋ฉด ๋ค์์ Thread์ ์ ์ ํ๊ฒ ์์ ์ ๋ถ๋ฐฐํ๋ ์ผ์ ๋๊ฐ ํ ๊ฒ์ธ๊ฐ ?
๋ฐ๋ก GCD๋ Queue์ ๋ฃ์ผ๋ฉด ๊ทธ์ ๋ฐ๋ฅธ ์ค๋ ๋๋ฅผ ์ ์ ํ๊ฒ ์์ฑํด ๋ถ๋ฐฐํด์ฃผ๋ ์ฒซ๋ฒ์งธ ๋ฐฉ๋ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ GCD์์ ์ฌ์ฉํ๋ Queue ์ด๋ฆ์ด Dispatch Queue์ด๋ค.
๊ทธ๋ผ Dispatch Queue์ ์์ ์ด ์ถ๊ฐ๋๋ฉด GCD๋ ์์ ์ ๋ง๋ ์ค๋ ๋๋ฅผ ์๋์ผ๋ก ์์ฑํด์ ์คํํ๊ณ , ์์ ์ด ์ข ๋ฃ๋๋ฉด ์ค๋ ๋๋ฅผ ์ ๊ฑฐํ๊ฒ ๋๋ค.
๐ Dispatch Queue๋?
์ฑ์ ๋ฉ์ธ ์ค๋ ๋๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋์์ ์์ฐจ์ ์ผ๋ก ๋๋ ๋์์ ์์ ์ ๊ด๋ฆฌํ๋ ๊ฐ์ฒด์ด๋ค.
๋์คํจ์น ํ
- ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ธ๋ก ๊ฐ์ฒด ํํ๋ก ์์ ์ ์ ์ถํ ์ ์๋ FIFO ํ์ด๋ค.
- ์์ ์ ์์ฐจ์ ์ผ๋ก ์คํํ๋ค.
- ๋ค์ด์จ ์์ ์ ์์คํ ์์ ๊ด๋ฆฌํ๋ ์ค๋ ๋ ํ์์ ์คํ๋๋ค.
- ์ฑ์ ๊ธฐ๋ณธ ์ค๋ ๋๋ฅผ ๋ํ๋ด๋ ๋์คํจ์น ํ๋ฅผ ์ ์ธํ๊ณ ์์คํ ์ ์์ ์ ์คํํ๋ ๋ฐ ์ฌ์ฉํ๋ ์ค๋ ๋๋ฅผ ๋ณด์ฅํ์ง ์๋๋ค.
์์ ํญ๋ชฉ์ ๋๊ธฐ์ ๋๋ ๋น๋๊ธฐ์์ผ๋ก ์์ฝํ๋ค.
1. ๋๊ธฐ์ : ํด๋น ํญ๋ชฉ์ ์คํ์ด ์๋ฃ๋ ๋๊น์ง ์ฝ๋๊ฐ ๊ธฐ๋ค๋ฆฐ๋ค.
2. ๋น๋๊ธฐ์ : ์์ ํญ๋ชฉ์ด ๋ค๋ฅธ ๊ณณ์์ ์คํ๋๋ ๋์ ์ฝ๋๊ฐ ๊ณ์ ์คํ๋๋ค.
์ฝ๋๋ ๊ฐ์ด ์ฐธ๊ณ ํด๋ณธ๋ค๋ฉด
DispatchQueue.global().sync {
// task
}
DispatchQueue : iOS์์ ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ๋๊ธฐ ์ํด ์ ๊ณตํ๋ Queue
Global : DispatchQueue์ ์ข ๋ฅ
Sync : ๋๊ธฐ
Async : ๋น๋๊ธฐ
์ฆ, global DispatchQueue์ ๋๊ธฐ์์ผ๋ก ์ผ(task)๋ฅผ ๋ณด๋ธ๋ค! ๋ผ๊ณ ํ ์ ์๋ค.
๐ GCD API ํ์์ฑ
GCD๋ฅผ ์ฌ์ฉํ๋ฉด ์ค๋ ๋ ์์ฑ, ์ ์ง, ์ญ์ ๋ฑ์ ๊ฐ๋ฐ์๊ฐ ์ ๊ฒฝ ์ธ ํ์ ์์ด ํด์ผํ ์์ (์ฝ๋)๋ฅผ ํ์ ์์ฝํ๊ธฐ๋ง ํ๋ฉด ๋๋ ํธ๋ฆฌํ๋ค.
DispatchQueue.global().sync{} JSON API ์์
// ๋ก๊ทธ์ธ ์ฑ๊ณต ์ฌ๋ถ ๋ฆฌํด
func GET_Login(member: Login) -> LoginSuccess {
var db = LoginSuccess.init()
if let url = URL(string: "์๋ฒ ์ฃผ์" +
"id=" + member.id +
"&pwd=" + member.pwd){
var request = URLRequest.init(url: url)
request.httpMethod = "GET"
DispatchQueue.global().sync {
URLSession.shared.dataTask(with: request) { (data, response, error) in
guard let data = data else { return }
// get
let decoder = JSONDecoder()
if let json = try? decoder.decode(LoginSuccess.self, from: data) {
db = json
}
}.resume()
}
}
// wait 0.5 sec
Thread.sleep(forTimeInterval: 0.5)
return db
}
์ฝ๋๋ฅผ ๋ถ์ํ์๋ฉด ..
์ฐ๋ฆฌ๊ฐ ํ๊ณ ์ถ์ ์ผ์ ๋ก๊ทธ์ธ DTO๋ฅผ ์ด์ฉํด LoginSuccess ๊ฐ์ ๋ฐ์์ค๊ณ ์ถ๋ค.
1. url, request๋ฅผ ์์ฑํ๋ค.
2. global DispatchQueue๋ฅผ ๋๊ธฐ์์ผ๋ก ์ฒ๋ฆฌํ๋ค.
3. shared ์ธ์คํด์ค์ dataTask()๋ฅผ ํธ์ถํ๋ค.
4. completion handler์ ๋์ด์ค๋ data, response, error๋ฅผ ์ฒ๋ฆฌํ๋ค.
5. data๋ฅผ ๊ฒ์ฆํ๊ณ ์ฌ์ฉํ๋ค.
6. JSONDecoder๋ฅผ ์ด์ฉํด์ ํ์ฑํด ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ค.
7. ์์ฑํ task๋ฅผ resume ์ํจ๋ค.
8. ์ํํ ์์ ์ ์ํด 0.5์ด๊ฐ ์ค๋ ๋๋ฅผ ์ค๋จ์์ผ ์์ ์ ํ๋ค.
9. ๋ก๊ทธ์ธ ์ฌ๋ถ๋ฅผ return ํ๋ค.
์ด๋ ๋๊ธฐ์ ๋ฐฉ๋ฒ์ด๋ค.
๐ก Why ๋๊ธฐ์(Synsc) ๋ฐฉ๋ฒ ?
๋๊ธฐ์ queue(Syne Queue)๋ queue์ ์ถ๊ฐ๋ ์์ ์ด ์ข ๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ queue์ด๋ ๋ก๊ทธ์ธ์ด ์ฑ๊ณต์ด ๋๊ณ , ์ฑ๊ณต ์ฌ๋ถ๋ฅผ ๋ฐ์์ค๋ ๊ฐ์ ์ผ์ ๋์์ ์งํํด์ผํ๊ธฐ ๋๋ฌธ์ ๋๊ธฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉ
'๐ iOS > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift][iOS] QOS (0) | 2023.06.13 |
---|---|
[Swift] Struct์ Class์ ์ฐจ์ด์ (1) | 2023.05.15 |
[Swift] Dispatch Queue (0) | 2023.01.27 |