Deep_Dev
article thumbnail

 

๐Ÿ“Œ 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