suvera-dev ๐Ÿฅฆ

iOS ) URLSession ์•Œ์•„๋ณด๊ธฐ ๋ณธ๋ฌธ

iOS

iOS ) URLSession ์•Œ์•„๋ณด๊ธฐ

suvera 2022. 2. 28. 00:19

์˜ค๋Š˜์€ ์ œ๊ฐ€ ์ตœ๊ทผ์— ์–ผ๋ ๋šฑ๋•… ์“ฐ๊ฒŒ ๋œ URLSession์„ ๊ณต๋ถ€ํ•ด๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค !

์„ธ๋ฏธ๋‚˜ ๋•Œ Alamofire ๋ฐฐ์šฐ๊ณ .. ํ•ฉ๋™ ์„ธ๋ฏธ๋‚˜์—์„œ๋Š” Moya ํ•˜๊ณ .. ์•ฑ์žผ์—์„œ๋Š” ์–ด์ฉŒ๋‹ค URLSession์„ ํ•˜๊ฒŒ ๋˜์—ˆ๋”๋‹ˆ ๋Œ€ํ˜ผ๋ž€ ๐ŸŒ€

์„œ๋ฒ„ํ†ต์‹  ๋„ˆ ๋Œ€์ฒด ๋ญ”๋ฐ.. 

 

์ด๋Œ€๋กœ๋Š” ์•ˆ๋˜๊ฒ ๋‹ค ์‹ถ์–ด์„œ URLSession, Alamofire, Moya ์ˆœ์œผ๋กœ ๋‹ค์‹œ ๊ฐœ๋… ๋ถ€ํ„ฐ ์‹ค์ „๊นŒ์ง€ .. ๊ณต๋ถ€ํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค :) 

์ผ๋‹จ ์ œ๊ฐ€ ๊ฐ€์žฅ ์ตœ๊ทผ์— URLSession์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ํ–ˆ๋Š”๋ฐ ๊ทธ๋ƒฅ.. ์•„๋ฌด ๊ฒƒ๋„ ๋ชจ๋ฅด๊ณ  ํ›„๋ฃจ๋ฃฉ ์จ๋ฒ„๋ ธ๋„ค์š”... 

 


URLSession 

iOS ์•ฑ์—์„œ ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•ด ์• ํ”Œ์€ URLSession์ด๋ผ๋Š” API๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 

iOS ์•ฑ ํ†ต์‹ ์—์„œ ์œ ๋ช…ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ Alamofire์˜ ๊ธฐ๋ฐ˜์ด ๋˜๋Š” API๋กœ ์„œ๋ฒ„์™€์˜ ๋ฐ์ดํ„ฐ ๊ต๋ฅ˜๋ฅผ ์œ„ํ•ด์„œ๋Š” ํ•„์ˆ˜์ ์œผ๋กœ ์•Œ์•„์•ผํ•˜๋Š” API !

 

URLSession์˜ Request์™€ Response

- URLSession์€ ๋‹ค๋ฅธ HTTP ํ†ต์‹ ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Request์™€ Response๋ฅผ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋กœ ๊ฐ€์ง

 

โœจRequest

- URL ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์ง์ ‘ ํ†ต์‹ ํ•˜๋Š” ํ˜•ํƒœ

- URLRequest ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ์˜ต์…˜์„ ์„ค์ •ํ•˜์—ฌ ํ†ต์‹ ํ•˜๋Š” ํ˜•ํƒœ

 

โœจResponse

- ์„ค์ •๋œ Task์˜ Completion Handler ํ˜•ํƒœ๋กœ response๋ฅผ ๋ฐ›๊ธฐ

- URLSessionDelgate๋ฅผ ํ†ตํ•ด ์ง€์ •๋œ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ˜•ํƒœ

 

์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ„๋‹จํ•œ response๋ฅผ ์ž‘์„ฑํ•  ๋•Œ์—๋Š” Completion Handler๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์•ฑ์ด background ์ƒํƒœ๋กœ ๋“ค์–ด๊ฐˆ ๋•Œ์—๋„ ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ๋ฅผ ์ง€์›ํ•˜๋„๋ก ์„ค์ •ํ•˜๊ฑฐ๋‚˜, ์ธ์ฆ๊ณผ ์บ์‹ฑ์„ default ์˜ต์…˜์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ƒํ™ฉ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” Delegate ํŒจํ„ด์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๊ฐœ๋ฐœ์ž ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ  ํ•˜์—ฌ ์ถ”๊ฐ€ ์„ค๋ช… !

URLSession  ์€ ํŠน์ •ํ•œ URL๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์—…๋กœ๋“œ  ํ•˜๊ธฐ ์œ„ํ•œ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. 

๊ด€๋ จ Delgegate๋Š” URLSessionDelegate ์™€ URLSessionTaskDelegate ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด Delegate๋“ค์„ ํ™œ์šฉํ•˜์—ฌ ์ธ์ฆ์„ ์ง€์›ํ•˜๊ฑฐ๋‚˜ redirection, task๋๋‚จ ๊ฐ™์€ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. 

 

session์„ configureํ•˜๊ธฐ ์œ„ํ•ด์„œ URLSessionConfiguration ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. configuration์„ ํ†ตํ•ด cache์™€ cookie๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ• ์ง€, ํ†ต์‹ ๋ง์— connection์„ ํ—ˆ์šฉํ• ์ง€ ๋“ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. 

URLSession์˜ ์ด๋‹ˆ์…œ๋ผ์ด์ €์—๋„ configuration์ด ๊ผญ ๋“ค์–ด๊ฐ€์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

์ด๋ ‡๊ฒŒ ์„ค๋ช…์„ ์ ์–ด๋ด๋„ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋„ค์š” ํ•˜ํ•˜ . ์ผ๋‹จ ๋” ์•Œ์•„๋ด…์‹œ๋‹ค.. 


URLSession์˜ ๊ธฐ๋ณธ ์ง„ํ–‰ ์ˆœ์„œ

  1. Session configuration์„ ๊ฒฐ์ •ํ•˜๊ณ , Session์„ ์ƒ์„ฑ
  2. ํ†ต์‹ ํ•  URL๊ณผ Request ๊ฐ์ฒด๋ฅผ ์„ค์ •
  3. ์‚ฌ์šฉํ•  Task๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ , ๊ทธ์— ๋งž๋Š” Completion Handler๋‚˜ Delegate ๋ฉ”์†Œ๋“œ๋“ค์„ ์ž‘์„ฑ
  4. ํ•ด๋‹น Task๋ฅผ ์‹คํ–‰
  5. Task ์™„๋ฃŒ ํ›„ Completion Handler๊ฐ€ ์‹คํ–‰

 

์•„๋‹ˆ ๊ทธ๋ž˜์„œ configuration..? task...? ๋„ˆ๋„ค ๋ญ”๋ฐ... ใ…œใ…œใ…œใ…œใ…œใ…œใ…œ 

 


1. URLSessionConfiguration

- URLSession์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•„์š”ํ•œ ์š”์†Œ

- Configuration์„ ์ƒ์„ฑํ•  ๋•Œ๋Š” URLSession ์ •์ฑ…์— ๋”ฐ๋ผ์„œ default, ephemeral, background ์„ธ ๊ฐ€์ง€ ํ˜•ํƒœ๋กœ ์ƒ์„ฑ

 

  1. Default Session: ๊ธฐ๋ณธ์ ์ธ Session์œผ๋กœ ๋””์Šคํฌ ๊ธฐ๋ฐ˜ ์บ์‹ฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  2. Ephemeral Session: ์–ด๋– ํ•œ ๋ฐ์ดํ„ฐ๋„ ์ €์žฅํ•˜์ง€ ์•Š๋Š” ํ˜•ํƒœ์˜ ์„ธ์…˜์ž…๋‹ˆ๋‹ค. ์ฟ ํ‚ค๋‚˜ ์บ์‹œ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๋Š” ์ •์ฑ…์„ ๊ฐ€์ ธ๊ฐˆ ๋•Œ  (ex. Safari์˜ ๊ฐœ์ธ์ •๋ณด๋ณดํ˜ธ ๋ชจ๋“œ)
  3. Background Session: ์•ฑ์ด ์ข…๋ฃŒ๋œ ์ดํ›„์—๋„ ํ†ต์‹ ์ด ์ด๋ค„์ง€๋Š” ๊ฒƒ์„ ์ง€์›ํ•˜๋Š” ์„ธ์…˜์ž…๋‹ˆ๋‹ค. ์•ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ์žˆ๋Š” ์ƒํ™ฉ์—์„œ ์ปจํ…์ธ  ๋‹ค์šด๋กœ๋“œ, ์—…๋กœ๋“œ๋ฅผ ํ•  ๋•Œ ์‚ฌ์šฉ 

 

2. URLSessionTask

- Task ๊ฐ์ฒด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ Session ๊ฐ์ฒด๊ฐ€ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ธ ํ›„, ์‘๋‹ต์„ ๋ฐ›์„ ๋•Œ URL ๊ธฐ๋ฐ˜์˜ ๋‚ด์šฉ๋“ค์„ ๋ฐ›๋Š”(retrieve) ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. 3๊ฐ€์ง€ ์ข…๋ฅ˜์˜ Task๊ฐ€ ์ง€์›๋ฉ๋‹ˆ๋‹ค. 

 

  1. Data Task - HTTP์˜ ๊ฐ์ข… ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์„œ Data ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰(Response ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—์„œ ์ฒ˜๋ฆฌ)
  2. Download Task - ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„์„œ ํŒŒ์ผ์˜ ํ˜•ํƒœ๋กœ ์ €์žฅํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰. ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋‹ค์šด๋กœ๋“œ ์ง€์› (์„œ๋ฒ„์—์„œ ์‘๋‹ต์œผ๋กœ ์ค€ ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์ผ์— ์ €์žฅํ•ด์ฃผ๋Š” task)
  3. Upload Task - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์›น ์„œ๋ฒ„๋กœ Data ๊ฐ์ฒด ๋˜๋Š” ํŒŒ์ผ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋กœ๋“œํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ (๋ฐ์ดํ„ฐ๋ฅผ request body์— ๋„ฃ์–ด์„œ ์„œ๋ฒ„์— ์—…๋กœ๋“œํ•˜๋Š” task)
๋”๋ณด๊ธฐ

JSON, XML, HTML ๋ฐ์ดํ„ฐ ๋“ฑ ๋‹จ์ˆœํ•œ ๋ฐ์ดํ„ฐ์˜ ์ „์†ก์—๋Š” ์ฃผ๋กœ ๋ฐ์ดํ„ฐ ์ž‘์—…์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ์šฉ๋Ÿ‰์ด ํฐ ํŒŒ์ผ์˜ ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ƒํƒœ์ธ ๊ฒฝ์šฐ์—๋„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์—…๋กœ๋“œ(๋‹ค์šด๋กœ๋“œ) ์ž‘์—…์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

 

- URLSessionTask๋ฅผ ์ดํ•ดํ•˜๋Š”๋ฐ ๋„์›€์ด ๋˜์—ˆ๋˜ ์˜ˆ์‹œ๋ฅผ ์ž ์‹œ ๊ฐ€์ ธ์™€๋ณด์ž๋ฉด .. 

 

์˜ˆ๋ฅผ ๋“ค์–ด, URLSession์„ ์›น ๋ธŒ๋ผ์šฐ์ €๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๊ทธ ์•ˆ์— ์—ฌ๋Ÿฌ ํƒญ๋“ค์ด ์žˆ์„ ๊ฑฐ ์•„๋‹ˆ์—์—ฌ ?? ํ‹ฐ์Šคํ† ๋ฆฌ.. ๋„ค์ด๋ฒ„.. ๋“ฑ๋“ฑ ์—ฌ๋Ÿฌ ์‚ฌ์ดํŠธ๋“ค ? 

๊ทธ๋Ÿฐ ์›น ์‚ฌ์ดํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ณ  ๋กœ๋“œํ•˜๋Š” ํƒญ์„ URLSessionTask๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค ! 

๊ทธ๋Ÿฌ๋ฉด ํ•˜๋‚˜์˜ URLSession์—๋Š” ์—ฌ๋Ÿฌ URLSessionTask๊ฐ€ ๋‹ค๋ฅธ ์›น ์‚ฌ์ดํŠธ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ฒ ์ฃต !

 

- ๊ทธ๋ฆฌ๊ณ  URLSession ๋„คํŠธ์›Œํ‚น ์ˆœ์„œ๋ฅผ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ์ถ•์•ฝํ•˜์ž๋ฉด.. 

 

  1. URL ๋งŒ๋“ค๊ธฐ
  2. URLSession ๋งŒ๋“ค๊ธฐ 
  3. URLSession ์ธ์Šคํ„ด์Šค์—๊ฒŒ task ์ฃผ๊ธฐ
  4. task ์‹œ์ž‘ํ•˜๊ธฐ  task.resume()

 


 

์ด์ œ ํ•œ๋ฒˆ ์ฝ”๋“œ๋ฅผ ๋ด๋ณด๋„๋ก ํ• ๊ฒŒ์š” ! 

 

1๋‹จ๊ณ„ : URL ๋งŒ๋“ค๊ธฐ 

2๋‹จ๊ณ„ : URLSession ๋งŒ๋“ค๊ธฐ 

func getData() {
        if let url = URL(string: APIConstants.sampleURL) {
            let session = URLSession(configuration: .default)
        }
    }

- APIConstants๋ผ๋Š” ํŒŒ์ผ์— sampleURL ๋กœ url ์ฃผ์†Œ๋ฅผ ๋„ฃ์–ด๋‘์—ˆ์Šต๋‹ˆ๋‹ค! 

- default session์„ ์ƒ์„ฑ

 

 

3๋‹จ๊ณ„ : URLSession ์ธ์Šคํ„ด์Šค์—๊ฒŒ Task ์ฃผ๊ธฐ !!

    open func dataTask(with request: URLRequest, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> URLSessionDataTask
    open func dataTask(with url: URL, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> URLSessionDataTask

 URLSession ์•ˆ์— ๋“ค์–ด์žˆ๋Š” dataTask๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด ...

- ์ง€์ •๋œ URL์˜ ๋‚ด์šฉ์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ์ž‘์—…์„ ๋งŒ๋“  ๋‹ค์Œ, ์™„๋ฃŒ์‹œ ํด๋กœ์ € ํ˜ธ์ถœ ( comletionHandler )

- completionHandler๋กœ escaping closure ๊ฐ€ ๋“ค์–ด์žˆ์Œ . (๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ด๋ถ€์—์„œ ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ )

- ํด๋กœ์ € ์•ž์— escaping ์ด ์žˆ์œผ๋ฉด, ํ•จ์ˆ˜์˜ ์ž‘์—…์ด ์™„๋ฃŒ๋œ ํ›„์— ํด๋กœ์ €๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. 

 

func getData() {
    if let url = URL(string: APIConstants.sampleURL) {
        let session = URLSession(configuration: .default)

        let task = session.dataTask(with: url) { data, response, error in
            
            // error๊ฐ€ ์กด์žฌํ•˜๋ฉด ์ข…๋ฃŒ
            guard error == nil else { return }

            // status ์ฝ”๋“œ๊ฐ€ 200๋ฒˆ๋Œ€์—ฌ์•ผ ์„ฑ๊ณต์ ์ธ ๋„คํŠธ์›Œํฌ๋ผ ํŒ๋‹จ
            let successsRange = 200..<300
            guard let statusCode = (response as? HTTPURLResponse)?.statusCode,
                  successsRange.contains(statusCode) else { return }
                  
            guard let resultData = data else { return }
            
        }
        task.resume()
    }
}

- completionHandler๋กœ ๋ฐ›์•„์˜จ data, response, error๋“ค์„ ๊ฐ๊ฐ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•ด์ฃผ๋ฉด๋ฉ๋‹ˆ๋‹ค ! 

- 3๊ฐ€์ง€ ๋ชจ๋‘ ์˜ต์…”๋„ ํ˜•ํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”์ธ๋”ฉ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค

 

์ž‘์—…์„ ๋งŒ๋“  ํ›„์—๋Š” resume() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค !

 

< ์ •๋ฆฌ >

 

๋งค๊ฐœ๋ณ€์ˆ˜ 

1. request 

- URL : URL ์š”์ฒญ ๊ฐ์ฒด 

2. completionHandler : ๋กœ๋“œ ์š”์ฒญ์ด ์™„๋ฃŒ๋˜๋ฉด ํ˜ธ์ถœํ•  ํด๋กœ์ € 

- data: ์„œ๋ฒ„์—์„œ ๋ฐ˜ํ™˜๋œ ๋ฐ์ดํ„ฐ

- response: HTTP ํ—ค๋” ๋ฐ ์ƒํƒœ ์ฝ”๋“œ์™€ ๊ฐ™์€ ์‘๋‹ต ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฐ์ฒด 

- error : ์š”์ฒญ์ด ์‹คํŒจํ•œ ์ด์œ  

+++ 3๊ฐ€์ง€ ์ „๋ถ€ optional ํ˜•ํƒœ ! 

 

๋ฆฌํ„ด ๊ฐ’ : ์ƒˆ ์„ธ์…˜ ๋ฐ์ดํ„ฐ task

 

 

 

4๋‹จ๊ณ„ : ๋ฐ›์€ ๋ฐ์ดํ„ฐ ํ™•์ธ !

func getData() {
    if let url = URL(string: APIConstants.sampleURL) {
        let session = URLSession(configuration: .default)

        let task = session.dataTask(with: url) { data, response, error in
        	
            // error๊ฐ€ ์กด์žฌํ•˜๋ฉด ์ข…๋ฃŒ
            guard error == nil else { return }

            // status ์ฝ”๋“œ๊ฐ€ 200๋ฒˆ๋Œ€์—ฌ์•ผ ์„ฑ๊ณต์ ์ธ ๋„คํŠธ์›Œํฌ๋ผ ํŒ๋‹จ
            let successsRange = 200..<300
            guard let statusCode = (response as? HTTPURLResponse)?.statusCode,
                  successsRange.contains(statusCode) else { return }
                  
            guard let JSONData = data else { return }
            
            let dataString = String(data: JSONData, encoding: .utf8)
            print(dataString!)
            

        }
        task.resume()
    }
}

- data๋ฅผ ๋ฐ›์•„ ์ŠคํŠธ๋งํ˜•์‹์œผ๋กœ ์ž˜ ๋“ค์–ด์™”๋Š”์ง€ ํ™•์ธ ์ดํ›„ JSON๊ฐ์ฒด ๋””์ฝ”๋“œ ๊ณผ์ •์„ ์ง„ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค ! 

 

5๋‹จ๊ณ„ : ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋””์ฝ”๋”ฉํ•˜๊ธฐ + ํ”„๋กœํผํ‹ฐ์— ์ €์žฅ ํ›„, reload 

do {
    let decodeData = try decoder.decode(Category.self, from: JSONData)
    self.cateogories = decodeData

    DispatchQueue.main.async {
        self.tableview.reloadData()
    }
} catch {
    // ๋””์ฝ”๋”ฉ ์—๋Ÿฌ
    print(error)

- data๋ฅผ ๋ฐ›์•„์„œ ๋””์ฝ”๋”ฉํ•˜๋Š” ๊ณผ์ •์—์„œ ๋””์ฝ”๋”ฉ ์—๋Ÿฌ ํ•ธ๋“ค๋ง์„ ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

- ์ •์ƒ์ ์œผ๋กœ ๋””์ฝ”๋”ฉ ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•˜์„ ๊ฒฝ์šฐ, ๋ทฐ์ปจ์—์„œ ๋งŒ๋“  ํ”„๋กœํผํ‹ฐ์— ์ €์žฅ์„ ํ•ด์ค๋‹ˆ๋‹ค

- DispatchQueue๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ” ๋ทฐ๋ฅผ reload ํ•ด์ค๋‹ˆ๋‹ค. 

 

 

++ ์ถ”๊ฐ€ ) 

ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ๋ณดํ†ต URLSession์„ ๋งŒ๋“ค์–ด์“ฐ๊ธฐ๋ณด๋‹ค๋Š”, shared๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 

URLSession์€ shared๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ํŽธํ•˜๊ฒŒ URLSession์˜ ํ•จ์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์ฃ !

shared๋ฅผ ์“ฐ๋ฉด ํŽธํ•˜์ง€๋งŒ ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. 

shared session์€ delegate๋„ ์—†๊ณ , ์ปค์Šคํ„ฐ๋งˆ์ด์ง•๋œ configuration๋„ ์—†๊ธฐ๋•Œ๋ฌธ์— ๋‹น์—ฐํžˆ ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

shared๋ฅผ ์‚ฌ์šฉํ• ๋•  ์•„๋ž˜์ฒ˜๋Ÿผ session์„ ๋”ฐ๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ , ๋ฐ”๋กœ shared ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค ! 

let task = URLSession.shared.dataTask(with: url) {
...
}

 

 

 

 

 

 

 

 

iOS URLSession ์ดํ•ดํ•˜๊ธฐ

iOS์—์„œ ๋„คํŠธ์›Œํ‚น์„ ๋„์™€์ฃผ๋Š” URLSession API์— ๋Œ€ํ•ด ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

hcn1519.github.io

 

+ ์˜ˆ์ œ ์ฝ”๋“œ : ์œ ํŠœ๋ธŒ Smile Han ๋‹˜์˜ ๋ฐ•์Šค์˜คํ”ผ์Šค ์•ฑ ๋งŒ๋“ค๊ธฐ ๊ฐ•์ขŒ๋ฅผ ์ฐธ๊ณ ํ•˜์˜€์Šต๋‹ˆ๋‹ค. 

Comments