๐ŸŒฑ 7์ฃผ์ฐจ: URLSession, Access Control, ARC

2023. 9. 4. 01:31ยท๐ŸŒฑ SeSAC iOS 3๊ธฐ

 

7์ฃผ์ฐจ ๊ธฐ๋ก: URLSession, Access Control, ARC

 

๐Ÿง ๋ฌด์—‡์„ ๋ฐฐ์› ๋‚˜?

- ์ฝ”๋“œ ์ชผ๊ฐœ๊ธฐ (Base ViewController, View, TableView, CollectionView)
- ์—ญ์œผ๋กœ ๊ฐ’์ „๋‹ฌ
- Access Control ์ ‘๊ทผ ์ œ์–ด์ž
- WKWebView
- URLSession 
- ARC
- Any vs AnyObject : Any (๋ชจ๋“  ํƒ€์ž…์„ ๋ฐ›์Œ), AnyObject (ํด๋ž˜์Šค์—์„œ๋งŒ ํ”„๋กœํ† ์ฝœ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ์•ฝ)
 
(+) viewController Naming ํ•˜๋Š” ๋ฒ•:  main, detail ๊ฐ™์€ ์ด๋ฆ„ ์ง“๊ธฐ๋Š” ์ง€์–‘ํ•˜๊ธฐ. ํ›—๋‚  ์—…๋ฐ์ดํŠธ ๊ณผ์ •์—์„œ ๊ทธ ์—ญํ• ์ด ๋ฐ”๋€” ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์ด๋ฆ„์„ ์ง€์„ ๊ฒƒ์„ ๊ณ ๋ คํ•ด๋ณผ ๊ฒƒ.
 

๐Ÿ”จ ์˜ˆ์ œ

- Photogram
- Media Project ์‘์šฉ + ๊ฐœ์„ 
 
 

๐Ÿ“š ๊ณผ์ œ

- Photogram ์—ญ์œผ๋กœ ๊ฐ’์ „๋‹ฌ, URLSession ์‘์šฉํ•ด๋ณด๊ธฐ
- Media Project (multiple Cell๋กœ ๊ฐ๊ธฐ ๋‹ค๋ฅธ API ํ†ต์‹  + UI ์ ์šฉ)
 
 


 
 

๐Ÿ’ฆ ๋ณต๊ธฐ

 

โœ”๏ธ MultipleCell

from Media Project
 

 
๊ณ ๋ฏผ ํ–ˆ๋˜ ๋ถ€๋ถ„: 
 
- ๊ฐ„๋‹จํ•˜๊ฒŒ UI๋ฅผ ๊ตฌ์„ฑํ•ด๋ณด๋Š” ๊ฒƒ๋„ ๊ณผ์ œ์˜ ์ผ๋ถ€์˜€๋Š”๋ฐ, ์ด๊ฒƒ๋„ ์€๊ทผ ์–ด๋ ค์› ๋‹ค. ์˜ํ™” ๊ฒ€์ƒ‰ ํ–ˆ์„ ๋•Œ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ๋ณด๊ธฐ ์ข‹์•˜์ง€? ํ•˜๋Š” ๊ฑธ ๊ณ ๋ฏผํ•˜๋‹ค ๋ณด๋‹ˆ UI๋„ ํ•œ ๋‘ ๋ฒˆ ์ •๋„ ์ˆ˜์ •ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.


- ๊ณผ์ œ์—” Base๋กœ ๊ฐ ์—ญํ• ๋ณ„๋กœ ๋‚˜๋ˆ„์–ด์„œ ๊ตฌ์„ฑํ–ˆ๊ณ , section์„ ํ™œ์šฉํ–ˆ๋‹ค. if๋ฌธ ์ข€ ๊ทธ๋งŒ ์“ฐ๊ณ  ์‹ถ์—ˆ๋Š”๋ฐ ์ด๋ฒˆ์—๋„ ์–ด๊น€์—†์ด if๋ฌธ ๊ตฌ๊ตฌ์ ˆ์ ˆ ์ฝ”๋“œ๋กœ ๊ตฌ์„ฑํ•˜๊ณ  ๋ง์•˜๋‹ค. ๊ทธ ๋•๋ถ„์— ์“ฐ๋‹ค๊ฐ€ ๊ด„ํ˜ธ ์ฒดํฌ๋งŒ ํ•œ ์„ธ ๋ฒˆ์€ ํ•œ ๋ชจ์–‘. ๋‚˜๋„ ... ์งง๊ณ  ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ๋ฅผ ์“ฐ๊ณ  ์‹ถ์€๋ฐ ์–ธ์ œ์ฏค..!!
 
- section ๋‚˜๋ˆ„๋Š” ๊ฑธ ์–ด๋–ป๊ฒŒ ํ• ์ง€ ๊ณ ๋ฏผํ–ˆ์—ˆ๋‹ค. ๊ฒ€์ƒ‰ํ•ด๋ณด๋‹ˆ ์…€์˜ ๋‚ด์šฉ์ด ๊ฐ™์€ ๊ฒƒ๋ผ๋ฆฌ ๋ฌถ๋Š” ๊ฒŒ ์ข‹๋‹ค๊ณ  ํ•ด์„œ, API ๋‚ด์šฉ ๊ทธ๋Œ€๋กœ movie, people, TV ์„ธ ๊ฐœ๋กœ ์„น์…˜์„ ๋‚˜๋ˆ„์–ด ์…€์„ ๊ตฌ์„ฑํ–ˆ๋‹ค.
 
- ์ด์ƒํ•˜๊ฒŒ Out of range ์˜ค๋ฅ˜๋ฅผ ํ…Œ์ด๋ธ”๋ทฐ ๋งŒ๋“ค๋•Œ๋งˆ๋‹ค ๋œจ๋Š”๋ฐ, count ํ•ด์คฌ๋Š”๋ฐ ๋ญ๊ฐ€ ๋ฌธ์ œ์•ผ! ์™ธ์น˜๋ฉด์„œ indexPath.row < movieList.results.count ์ด๋Ÿฐ ์‹์œผ๋กœ ๊ณ ์ณ ์ผ๋‹ค. ๋•๋ถ„์— if ๋ฌธ ์“ฐ๋Š” ๋‚˜์˜ ์ฝ”๋“œ๋Š” ์†์ ˆ์—†์ด ๊ธธ์–ด์ง€๊ณ .....
 
- ๊ทธ๋ฆฌ๊ณ  ์„น์…˜ UI๋„ ๊ณ ๋ฏผ์„ ํ–ˆ์—ˆ๋Š”๋ฐ, ์ˆ˜์—…์—์„  header..... ๊ทธ ์ด๋ฆ„ ๊ธด ๊ฑธ๋กœ xib ํŒŒ์ผ๋กœ ๋งŒ๋“ค์–ด์„œ ์„น์…˜ ๋‚ด ํฐํŠธ์™€ ๋†’์ด ์ง€์ •์„ ํ–ˆ๋˜ ๊ธฐ์–ต์ด ๋‚˜์„œ ๊ทธ๊ฑธ ์ฝ”๋“œ๋ฒ ์ด์Šค๋กœ ํ•ด์„œ ์‚ฝ์ž…ํ•˜๋ ค๋‹ˆ ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ฒŒ ๋А๊ปด์กŒ์—ˆ๋‹ค. ์™œ๋ƒ๋ฉด ๋‚œ ์ง€๊ธˆ ํ…Œ์ด๋ธ”๋ทฐ์™€ ์ปฌ๋ ‰์…˜๋ทฐ๋ฅผ ๋งŒ๋“ค๋ฉด ์ด๊ฒŒ ํ™”๋ฉด์— ์•ˆ๋‚˜์˜ฌ๊นŒ๋ด ๋นŒ๋“œ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค ๊ธด์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์กฐ๊ธˆ... ์ด๊ฒƒ๋งŒํผ์€.. ์‰ฝ๊ฒŒํ•˜๊ณ  ์‹ถ์—ˆ๋˜ ๋งˆ์Œ.  => ์„น์…˜์— ๋Œ€ํ•ด ๊ฒ€์ƒ‰ํ•˜๋‹ค๊ฐ€ heightForHeaderInSection, titleForHeaderInSection ๋ž€ ๊ฑธ ์•Œ ๊ฒŒ ๋˜์–ด์„œ ์ด ๋‘ ๊ฐœ๋ฅผ ์จ์„œ ์ •๋ง ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค. ๊ทผ๋ฐ ์ด๊ฑด ๋†’์ด ์ง€์ •์ด๋ผ๋˜๊ฐ€ ํฐํŠธ ํฌ๊ธฐ ๋“ฑ ์กฐ์ ˆ์ด ์ˆ˜์—… ๋•Œ ์„น์…˜ UI๋กœ ๋ฐฐ์› ๋˜ ๊ฒƒ์— ๋น„ํ•ด ์ž์œ ๋กญ์ง€๊ฐ€ ์•Š์•„์„œ ๋ณ„๋กœ์˜€๋˜ ๋“ฏ. ๋ช‡ ์™ธ๊ตญ ๋ธ”๋กœ๊ทธ์— ๋‚˜์˜จ ๊ฑธ ์“ฐ๋ ค๊ณ  ํ•˜๋‹ˆ '์ด๊ฑฐ ๊ณง ๊ธฐ๋Šฅ์—์„œ ๋บ„ ์˜ˆ์ •์ด์•ผ~' ํ•˜๋Š” ๋ฌธ๊ตฌ๊ฐ€ ๋œจ๋Š” ๊ฑธ ๋ณด์•„ ๊ทธ๋ƒฅ ์—ฌ๋Ÿฌ๋ชจ๋กœ ์•ˆ ์“ฐ๋Š” ๊ฒŒ ๋‚˜์„ ๊ฒƒ ๊ฐ™๋‹ค.
 
- URLSession์„ ์ ์šฉํ•ด๋ณด๋ ค๊ณ  ํ–ˆ๋‹ค๊ฐ€, ์ด๋ฏธ์ง€ ํŒŒ์ผ ์™ธ์—” ๋„์ €ํžˆ ๋ชป ๋„˜๊ธฐ๊ฒ ์–ด์„œ + ์•„์ง URLSession์„ ๊ฐœ๋… ์™ธ ์‘์šฉ์€ ์ˆ˜์—… ์ฝ”๋“œ๋ณด๊ณ  ๋”ฐ๋ผ์น˜๊ธฐ... ์ •๋„ ๋ฐ–์— ์•ˆ๋˜์„œ ์ผ๋‹จ ๋ณด๋ฅ˜ํ–ˆ๋‹ค. 2์ฃผ..๋’ค์—”.. ํ•  ์ˆ˜ ์žˆ์„์ง€๋„.
 
 
 


 
 

โœ”๏ธ Base

 
- override์˜ ๊ฐœ๋… ์ˆ™์ง€๊ฐ€ ํ•„์š”ํ–ˆ๋˜, base๋ฅผ ๋‚˜๋ˆ ์„œ ํด๋ž˜์Šค ์ƒ์„ฑํ•˜๊ธฐ. ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ๊ทธ๋Œ€๋กœ ํ™œ์šฉํ•ด์„œ ์ข‹์•˜๋˜ ์ ์€ view.background = .white๋ฅผ ๊ผฌ๋ฐ•๊ผฌ๋ฐ• ํ•ด์ฃผ์ง€ ์•Š์•„๋„ ๋˜์—ˆ๋‹จ ๊ฒƒ๊ณผ ํ•˜๋‚˜์˜ ํŒŒ์ผ ๋‹น ์“ฐ์ด๋Š” ์ฝ”๋“œ๊ฐ€ ์ค„์–ด๋“ค์—ˆ๋‹ค๋Š” ๊ฒƒ. ๋‹ค๋งˆ๊ณ ์น˜๋งŒ ๋– ์˜ฌ๋ฆฌ๋ฉด ๋‚ด ์ฝ”๋“œ๊ธธ์ด์— ๋ฉ€๋ฏธ๊ฐ€ ๋‚˜๋Š”๋ฐ, base๋ฅผ ์“ฐ๊ณ ๋‚˜๋ฉด์„œ๋ถ€ํ„ฐ ๊ธธ์ด์˜ ์••๋ฐ•์ด ์ข€ ์ค„์–ด๋“ค์—ˆ๋‹ค.
- ์˜คํ”ˆ์†Œ์Šค๊นŒ์ง€ ์ž„ํฌํŠธ ํ•ด์„œ ์“ธ ์ˆ˜ ์žˆ๋‹ค. → ๋‹จ, ์ƒ์†๋ฐ›๋Š” ๋ชจ๋“  ๋ทฐ๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•จ. (ex.ํ•˜๋‚˜์˜ ๋ทฐ๋งŒ alamofire๋ฅผ ์‚ฌ์šฉํ•  ๋• base์— ์ž„ํฌํŠธ ํ•˜๋Š” ๊ฑด ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค)
 
 
- BaseView

let mainView = SearchView() 

override func loadView() { 
        self.view = mainView
    }

baseView๋ฅผ ํ™œ์šฉํ•  ๋• ๊ผญ loadView ํ•ด์ฃผ๋Š” ๊ฑธ ์žŠ์ง€ ๋ง์ž. loadView๋ฅผ ํ•ด์ฃผ๋Š” ์ด์œ  = ์• ํ”Œ์ด ๋งŒ๋“  ๋ทฐ ๋ง๊ณ  ์ปค์Šคํ…€๋ทฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์„ธํŒ…ํ•ด์ฃผ์–ด์•ผ ํ•จ.
 
 
 
 


 
 
 

โœ”๏ธ ์—ญ์œผ๋กœ ๊ฐ’์ „๋‹ฌ

 

  1. property
  2. closure
  3. notification
  4. delegate pattern

 
- ๋‚œ.. ์‚ฌ์‹ค ์•„์ง๋„ notification ํ™œ์šฉ์€ ์ž˜ ๋ชป ํ•˜๊ฒ ๋‹ค... ใ…Žใ…Ž... ๋ญ”๊ฐ€ ๊ฐœ๋…๊ณผ ์ •์˜๋ฅผ ๋ณด๋ฉด + ๋ธ”๋กœ๊ทธ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด ๋Œ€์ถฉ ์•Œ๊ฒ ๋Š”๋ฐ ๋ชจ๋ฅด๊ฒ ์–ด. ์ด๋Ÿฐ ์ƒํƒœ. ๋ฐฐ์—ด, ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ํ™œ์šฉํ• ๋•Œ๋งˆ๋‹ค ์ข€ ๋งŽ์ด ํ—ค๋งค๋Š” ํŽธ์ธ๋ฐ ๊ฐ’์„ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋ฐ›์•„์„œ ๊ทธ๋Ÿฐ ๊ฒƒ ๊ฐ™๊ธฐ๋„. ์ผ๋‹จ์€ ํด๋กœ์ €๋ž‘ ๋”œ๋ฆฌ๊ฒŒ์ดํŠธ ์œ„์ฃผ๋กœ ๊ฐ’์ „๋‹ฌ ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ๊ผญ! notification์„ ์จ์•ผํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ๋“  ํ•ด๋ณด๊ฒ ์ง€๋งŒ...
 
 
 
 


 
 
 

โœ”๏ธ Access Control (์€๋‹‰ํ™”)

  • ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œํ•œํ•˜๊ฑฐ๋‚˜ ์กฐ๊ฑด์„ ๊ฑธ๊ณ  ์‹ถ์„ ๋•Œ ํ™œ์šฉ.
  • (๊ฐ€์žฅ ์ œํ•œ ์—†์Œ) open > public > internal > fileprivate > private (๊ฐ€์žฅ ์ œํ•œ์ )
  • ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ? ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ์•„์ง€๊ณ  ์‘์ง‘๋„๋Š” ๋†’์•„์ง.
    • ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ์š”์†Œ๋“ค๋ผ๋ฆฌ ๋ฌถ๊ธฐ ๋•Œ๋ฌธ์— ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ๋“ค์„ ํ•˜๋‚˜๋กœ ํ™•์ธ/๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ. → ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ™œ์šฉ.
  • ๋ชจ๋“ˆ๊ณผ ํƒ€๊ฒŸ์„ ๊ธฐ์ค€์œผ๋กœ ์ ‘๊ทผ์ œ์–ด์ž๋ฅผ ๋‹ค๋ฃฌ๋‹ค.
  • ๋ชจ๋“ˆ์˜ ๊ธฐ์ค€ ์ค‘์š”
    • import๋ฅผ ํ•ด์•ผ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ.
    • ๊ฐ๊ฐ์˜ ๋ชจ๋“ˆ์€ ๊ฐ๊ฐ์˜ ํƒ€๊ฒŸ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ.
    • open, public : ๋ชจ๋“ˆ ๋ฐ–์˜ ๊ฒƒ์— ์ ‘๊ทผํ• ๋•Œ ์‚ฌ์šฉ.
      • overriding์ด ๋˜๋ƒ ์•ˆ ๋˜๋ƒ์˜ ์ฐจ์ด.
      • open์€ overriding ๊ฐ€๋Šฅ
        • ์ƒ์†์ด ๊ฐ€๋Šฅํ•˜๋‹ค, ํด๋ž˜์Šค์—์„œ๋งŒ ์˜คํ”ˆ ์‚ฌ์šฉ ๊ฐ€๋Šฅ → ์ƒ์†์˜ ๊ตฌ์กฐ = ํด๋ž˜์Šค, open ์ œ์–ด์ž๋ฅผ ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ฑด ๊ฒฐ๊ตญ class๋ฟ.
      • public์€ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์— ์ ‘๊ทผํ•  ๋•Œ ์˜๋ฏธ๊ฐ€ ์žˆ์Œ.
    • internal, private, fileprivate : ๋ชจ๋“ˆ๊ณผ ๋ชจ๋“ˆ ์‚ฌ์ด์—์„œ์˜ ์ ‘๊ทผ ๋ ˆ๋ฒจ์ด ๋˜์ง€ ์•Š์Œ. ์ ‘๊ทผ์ œ์–ด๊ฐ€ ๋ชจ๋“ˆ์„ ๋ฒ—์–ด๋‚  ์ˆ˜ ์—†์Œ.
  • open, public → ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์ ‘๊ทผํ•ด์„œ import๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•  ๋•Œ. ์• ํ”Œ์ด ๋งŒ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋‚ด๊ฐ€ ๋งŒ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ ์ด์œ . → module๋กœ ์ ‘๊ทผ (๋‚ด ํ”„๋กœ์ ํŠธ์—์„  ์“ฐ์ผ ์ผ์ด ์—†์Œ))
  • internal, private, filePrivate → sourcefile๋กœ ์ ‘๊ทผ, internal(ํ”„๋กœ์ ํŠธ๋‚ด ๋ชจ๋“ˆ๋‚ด ๋‹ค ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค!) internal class ์ด ๋””ํดํŠธ ์„ค์ •์ž„. ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ ํ˜ธ์ถœํ•˜์ง€๋งˆ! = private
  • private์ด ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ž„.

 
 
 


 
 
 

โœ”๏ธ WKWebView

 
- ์• ํ”Œ์ด ์ œ๊ณตํ•ด์ฃผ๋Š” ์ฝ”๋“œ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋œ๋‹ค.
- UINavigationBarAppearance ์— ๋Œ€ํ•ด์„œ๋„ ๋ฐฐ์› ๋‹ค. ์Šคํฌ๋กค ํ• ๋•Œ ๋„ค๋น„๊ฒŒ์ด์…˜ ์˜์—ญ์ด ์‚ฌ๋ผ์งˆ ์ˆ˜๋„, ํˆฌ๋ช…ํ•ด์งˆ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ.
 

import UIKit
import WebKit


class WebViewController: UIViewController, WKUIDelegate {
    
    var webView: WKWebView!
    
    override func loadView() {
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.uiDelegate = self
        view = webView
    }


    override func viewDidLoad() {
        super.viewDidLoad()
        
        let myURL = URL(string:"https://www.apple.com")
        let myRequest = URLRequest(url: myURL!)
        webView.load(myRequest)
    }
    
    func reloadButtonclicked() {
        webView.reload()
    }
    
    func goBackButtonClicked() {
        if webView.canGoBack  {
            webView.goBack()
        }
    }
    
    func goForwardButtonClicked() {
        if webView.canGoForward {
            webView.goForward()
        }
    }
    
}

 
 
https://developer.apple.com/documentation/webkit/wkwebview

 

WKWebView | Apple Developer Documentation

An object that displays interactive web content, such as for an in-app browser.

developer.apple.com

 
 
 


 

โœ”๏ธ UIResponder

 
- ์‚ฌ์šฉ์ž์˜ ์•ก์…˜์„ ๊ฐ์ง€
- UIView๊ฐ€ ์ƒ์† ๋ฐ›๊ณ  ์žˆ์Œ.
 

//์ฐฝ์„ ํ‚ค์ž๋งˆ์ž ์„œ์น˜๋ฐ”๊ฐ€ ์˜ฌ๋ผ์™€์„œ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ.

override func viewDidLoad() {
        super.viewDidLoad()
        
        mainView.searchBar.becomeFirstResponder()
        
    }

//์„œ์น˜๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด ๋‚ด๋ ค๊ฐ“
extension SearchViewController: UISearchBarDelegate {
    
    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
        mainView.searchBar.resignFirstResponder()
    }
    
}

 
 
 
 
 


 
 

โœ”๏ธ URLSession

 
URLSession

  • ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•˜๊ฑฐ๋‚˜ ์—…๋กœ๋“œ ํ•˜๋Š” ๋“ฑ์˜ API๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ํด๋ž˜์Šค๋กœ URL์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ์—”๋“œํฌ์ธํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
  • URLSession API๋ฅผ ํ†ตํ•ด ํƒ€์ž„์•„์›ƒ, ์บ์‹œ ์ •์ฑ…, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋ฐ์ดํ„ฐ ์ „์†ก ๋“ฑ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Œ.
  • ๊ฐ„๋‹จํ•˜๊ณ  ๊ธฐ๋ณธ์ ์ธ ์š”์ฒญ์ธ ๊ฒฝ์šฐ์—๋Š” Shared Session, ๋ณ„๋„๋กœ ์ปค์Šคํ…€์„ ํ•˜๋ ค๋ฉด Session Configuration.
    • session Configuration๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋ชฉ์ ์— ๋”ฐ๋ผ Default, Ephemeral, Background Session๋กœ  ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ์Œ.

 
URLSessionConfiguration

  •  
  • ํ™˜๊ฒฝ์„ค์ • (๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ํ•˜๊ธฐ์œ„ํ•œ ์„ค์ •)
    • ์‹œํฌ๋ฆฟ๋ชจ๋“œ
    • ๋ณด์•ˆ, ์บ์‹ฑ, ์„ธ์…˜
    1. sharedSession : ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ตฌ์„ฑ๋œ ํ™˜๊ฒฝ์„ธํŒ…. (ex.alamofire)
      1. ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด ๊ตฌ์กฐ๋กœ ๊ธฐ๋ณธ ์„ค์ •
      2. ๋‹จ์ˆœํ•œ ๋„คํŠธ์›ŒํŠธ ์š”์ฒญ์„ ํ• ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ
      3. ์ปค์Šคํ„ฐ๋งˆ์ด์ง• X
    2. DefaultSession : ์ง„ํ–‰๋ฅ ์„ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์œผ๋ฉด, defaultSession์„ ์‚ฌ์šฉํ•œ๋‹ค. (shared๋ž‘ ๊ฑฐ์˜ ๋น„์Šทํ•จ...)
      1. URLSessionConfiguration์„ ํ†ตํ•ด ์ง์ ‘ ์ƒ์„ฑํ•˜๋Š” ์„ธ์…˜์œผ๋กœ, Shared Session๊ณผ ๊ธฐ๋ณธ ์„ค์ •์ด ์œ ์‚ฌ.
      2. ์ปค์Šคํ„ฐ๋งˆ์ด์ง• O
    3. EphemeralSession (๋ณด์•ˆ)
      1. shared Session๊ณผ ๊ธฐ๋ณธ ์„ค์ •์ด ๋น„์Šทํ•˜๊ฒŒ ๋˜์–ด ์žˆ์ง€๋งŒ, ์ฟ ํ‚ค, ์บ์‹œ, ์ธ์ฆ ์ •๋ณด ๋“ฑ์„ ๋””์Šคํฌ์— ๊ธฐ๋กํ•˜์ง€ ์•Š์Œ.
      2. private ๊ธฐ๋Šฅ ๋“ฑ์„ ๊ตฌํ˜„ํ•  ๋•Œ ์‚ฌ์šฉ (ex. ์‹œํฌ๋ฆฟ ๋ชจ๋“œ)
    4. BackgroundSession
      1. URLSessionConfiguration์„ ํ†ตํ•ด ์ง์ ‘ ์ƒ์„ฑํ•˜๋Š” ์„ธ์…˜์œผ๋กœ ์•ฑ์ด ์‹คํ–‰์ค‘์ด์ง€ ์•Š์„ ๋•Œ๋‚˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ƒํƒœ์—์„œ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•˜๊ฑฐ๋‚˜ ์—…๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ์Œ.

 
URLSessionTask

  • ์„ธ์…˜์ด ์ƒ์„ฑ๋œ ์ดํ›„์—๋Š” Task๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, URLSession์„ ํ†ตํ•ด ์ƒ์„ฑ๋˜๋Š” ๊ฐœ๋ณ„ ์š”์ฒญ = Task.
  • ์š”์ฒญ - ์‘๋‹ต ๋ฆฌ์†Œ์Šค : (์ œ์ด์Šจ )๋ฐ์ดํ„ฐ๊ฐ€ ์ ๊ฒŒ ๋“ฆ. ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๊ตฌํ˜„ํ•˜๋ ค๋Š” ๋ชฉ์ ์— ๋”ฐ๋ผ ํ…Œ์Šคํฌ ํƒ€์ž… ๊ฒฐ์ •.
    • task
      • Task๋Š” suspended ์ƒํƒœ๋กœ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, Task๋ฅผ ์ƒ์„ฑํ•œ ์ดํ›„์—๋Š” resume ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด task๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๊ณ , ๋”ฐ๋ผ์„œ resume์„ ํ˜ธ์ถœํ•ด์•ผ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Œ.
      • data : ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ.
      • upload
      • download : ๋ฐ์ดํ„ฐ์–‘์ด ํฐ ๊ฒƒ.
      • stream : ์†Œ์ผ“.

 
URLRequest

  • ๋„คํŠธ์›Œํฌ ์š”์ฒญ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํ‘œํ˜„
  • ๋„คํŠธ์›Œํฌ์— ์š”์ฒญ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„  URLSession์ด ํ•„์š”.

 
URLResponse

  • ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต ๋ฐ›์€ ํ…Œ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ completionHandler ๋˜๋Š” SessionDelegate.
    • completionHandler:
      • task ๋‹ค ๋๋‚˜๊ณ  ์‹คํ–‰. ๋‹จ ํ•œ๋ฒˆ๋งŒ ์‹คํ–‰ ๋œ๋‹ค. ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌ๊ฑฐ๋‚˜ ํ•˜๋ฉด ํ•œ๊ณ„๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— delegate ์‚ฌ์šฉ์„ ํ•œ๋‹ค. (shared)
      • ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ ๋ฐ›์€ data์™€ HTTP Header, ์‘๋‹ต์— ๋Œ€ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋“ฑ์˜ ์ •๋ณด๊ฐ€ ๋“ค์–ด์žˆ๋Š” response, ์š”์ฒญ์ด ์‹คํŒจํ–ˆ์„ ๋•Œ์— ๋Œ€ํ•œ error ๊ฐ’์„ ์ „๋‹ฌ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • sessionDelegate :
      • Task๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์— ๋Œ€ํ•ด์„œ ์„ธ๋ถ€์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ ์ž ํ• ๋•Œ ์‚ฌ์šฉ.
        • ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ตœ์ดˆ๋กœ ์‘๋‹ต์„ ๋ฐ›์•˜์„ ๋•Œ, ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„ ๋•Œ๋งˆ๋‹ค, ๋ฐ์ดํ„ฐ ์ „์†ก์„ ๋‹ค ๋ฐ›์€ ์‹œ์  ๋“ฑ์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅ.
      • ์ตœ์ดˆ์‘๋‹ต / 10%, 20% ์ค‘๊ฐ„๊ณผ์ • … ์ง„ํ–‰๋ฅ ์— ๋Œ€ํ•œ ๋Œ€์‘์ด ๊ฐ€๋Šฅํ•˜๋‹ค. (shared X) ์‘๋‹ต ์ค‘๊ฐ„์ค‘๊ฐ„ ์–ผ๋งŒํผ ๋ฐ›์•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์Œ (์ด๊ฒŒ shared๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ด์œ .)

 
 
? :
 
- alamofire, kingfisher๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ๋„คํŠธ์›Œํฌํ†ต์‹ ์„ ํ•  ์ˆ˜ ์žˆ๋‹จ ์ ์ด ์ •๋ง ๋งค๋ ฅ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ!..... ๋„ˆ๋ฌด ์–ด๋ ต๋‹ค. ์—ญ์‹œ ๋„คํŠธ์›Œํฌ ํ†ต์‹  ^^... ๋“ค์–ด์˜ค์ž๋งˆ์ž ๊ธ‰๊ฒฉํžˆ ๋–จ์–ด์ง€๋Š” ์ดํ•ด๋ ฅ์ด๋ž€. ์ฃผ๋ง ๋‚ด๋‚ด URLSession ์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ณผ์ œ๋ฅผ ํ•ด๋ณด๋ ค๊ณ  ์ˆ˜์—… ์ฝ”๋“œ๋ฅผ ๋ดค์ง€๋งŒ, ํ”„๋กœํ† ์ฝœ + dispatchQueue์˜ ์žฌ๋“ฑ์žฅ + ์žŠ๊ณ  ์žˆ๋˜ do-try-catch ํ™œ์šฉ ๋“ฑ ๋”ฐ๋กœ ๋ณด๋ฉด ์•Œ๊ฒ ๋Š” ์ฝ”๋“œ๊ฐ€ ์ข…ํ•ฉ์„ ๋ฌผ์„ธํŠธ์ฒ˜๋Ÿผ ํ•จ๊ป˜ ์žˆ์œผ๋‹ˆ ๊ณ„์† ๋ฌผ์Œํ‘œ ์ƒํƒœ๋งŒ ๋˜์–ด์„œ ๊ทธ๋ƒฅ ์ˆ˜์—…์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ๋น„์Šทํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ผ์š”์ผ ๋˜์„œ์•ผ ๊ณผ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” searchbar query์˜ ์žˆ๊ณ  ์—†๊ณ  ์ฐจ์ด ์ •๋„์˜€์ง€๋งŒ.
 
- ์ผ๋‹จ ์ดํ•ดํ•œ ๊ฑด, image์™€ ๊ฐ™์€ UI์  ์š”์†Œ๋Š” main thread๊ฐ€ ํ•ด๊ฒฐํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ (์ด ๋ถ€๋ถ„ ์ผ๋ถ€๋Ÿฌ ๋นผ๋†“๊ณ  ๋นŒ๋“œ ํ•ด๋ณด๋‹ˆ ๋ณด๋ผ์ƒ‰ ๊ฒฝ๊ณ ๊ฐ€ ๋œฌ๋‹ค. ์•„๋งˆ ๋นผ๋จน์–ด๋„ ์ด๊ฑด ๋ณด๋ผ์ƒ‰ ๊ฒฝ๊ณ  ๋ณด๊ณ  ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ผ๋‹จ ๋””์ŠคํŒจ์น˜ ํ™œ์šฉ ํƒ€์ด๋ฐ ์žก์•„๋„ ๋‚˜์˜์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™๊ณ ... ).
 
- ํ•œ๋™์•ˆ์€ API Manager ๊ด€๋ จ ์ฝ”๋“œ๋Š” ์ˆ˜์—… ์ฝ”๋“œ ์ฐธ๊ณ  ํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค..ใ…Ž.ใ…Žใ…Žใ…Ž... 
 
 
 


 
 

โœ”๏ธ ARC

* ์• ํ”Œ ๊ณต์‹ ๋ฌธ์„œ ๊ธฐ๋ฐ˜์œผ๋กœ ์ •๋ฆฌ
 
ARC๋Š” Automatic Reference Counting์˜ ์•ฝ์ž๋กœ, Swift๋ž€ ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ ์‚ฌ์šฉ์ž์˜ ์•ฑ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ถ”์ ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ARC๋Š” ๋”์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ž๋™์œผ๋กœ ์—†์• ์ฃผ๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ARC ๋“ฑ์žฅ ์ด์ „์—” MRC๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, MRC๋Š” ์ˆ˜๋™์œผ๋กœ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋ผ ๊ฐœ๋ฐœ์ž๊ฐ€ retain - release (์ถ”๊ฐ€-์‚ญ์ œ)๋ฅผ 1:1๋กœ ๋‹ค ๋Œ€์‘ ํ•ด์ฃผ์–ด์•ผ ํ–ˆ๋‹ค.
 
- Reference Counting (์ฐธ๊ณ  ์นด์šดํŒ…,  RC)๋Š” only ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์—๋งŒ ์ ์šฉ๋œ๋‹ค.
- ์ธ์Šคํ„ด์Šค๊ฐ€ ๋”์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์„ ๋•Œ, ARC๋Š” ๊ทธ ์ธ์Šคํ„ด์Šค๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง€์›Œ๋ฒ„๋ฆฌ๋Š”๋ฐ, ์ด๋Š” ๊ทธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๋‹ค๋ฅธ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ํ•„์š”ํ•˜์ง€ ์•Š๋Š” ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ž๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ์ง€ ์•Š๋„๋ก ๊ทธ ์ธ์Šคํ„ด์Šค์™€ ๊ด€๋ จ๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋น„์›Œ์„œ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™•๋ณดํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
- ๋‹จ, ์ด๋•Œ ์„œ๋กœ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ์ธ์Šคํ„ด์Šค๋“ค์ด ์žˆ์œผ๋ฉด ๊ฐ•ํ•œ ์ˆœํ™˜ ์ฐธ์กฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ์•„๋ฌด๋ฆฌ Automatic์ด๋ผ์ง€๋งŒ ์ด๋Ÿฐ ์ƒํ™ฉ์—์„  reference count๊ฐ€ 0์ด ๋˜์ง€ ์•Š์•„์„œ ๋– ๋Œ์ด ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋‚จ๊ฒŒ ๋˜๊ณ , ์ฆ‰ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ํ˜„์ƒ์ด ๋˜๊ณ  ๋งŒ๋‹ค.
 
 
๊ฐ•ํ•œ ์ˆœํ™˜์ฐธ์กฐ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์•ˆ ๋‘๊ฐ€์ง€ :
 
weak vs Unowned
 
๊ณตํ†ต์ 
์ฐธ์กฐํ•˜๋Š” ์ธ์Šคํ„ด์Šค์˜ RC๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค.
 
์ฐจ์ด์ 
- weak : ์ฐธ์กฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜๋ฉด nil๊ฐ’ (์—ฐ๊ฒฐ๊ณ ๋ฆฌ๋ฅผ ๋”ฐ๋ผ์„œ ์ €์žฅ๋˜์–ด์žˆ๋Š” ๊ฐ’์„ ๋ชจ๋‘ nil๋กœ ๋ฐ”๊ฟˆ), ์˜ต์…”๋„ ์„ ์–ธ ํ•„์š”, ์ฐธ์กฐํ•˜๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ๋” ์งง์€ lifetime์„ ๊ฐ€์งˆ ๋•Œ ํ™œ์šฉํ•  ๊ฒƒ
- unowned : ์ฐธ์กฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜๋ฉด ๋ณ„๋‹ค๋ฅธ ๋Œ€์‘ ์—†์Œ. (๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ์ฃผ์†Œ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์Œ, ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ธ์Šคํ„ด์Šค๊ฐ€ ์‚ฌ๋ผ์กŒ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ์˜ค๋„ˆ๋ผ๋Š” ๊ณณ์—์„  ์—ฌ์ „ํžˆ ๋ณด์œ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์˜ค๋„ˆ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์œ ์ €๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์˜ค๋ ค๊ณ  ํ•จ), ์ฐธ์กฐํ•˜๋Š” ์ธ์Šคํ„ด์Šค์™€ lifetime์ด ๊ฐ™๊ฑฐ๋‚˜ ๋” ๊ธธ ๋•Œ ํ™œ์šฉํ•  ๊ฒƒ, ์ดˆ๊ธฐํ™” ํ•„์š” ์—†์Œ!
 
 
Closure capture
 
- ๊ฐ’์ด ์•„๋‹Œ reference๋ฅผ caputreํ•œ๋‹ค. 
- ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ๋๋‚˜๊ณ ๋„ ์‚ด์•„์žˆ๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ์žˆ์–ด์„œ ์บก์ณ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜๋‹ค.
 
..... ์ด๋ถ€๋ถ„์€ ์ข€ ๋” ์ดํ•ด๋˜๋ฉด ์ถ”๊ฐ€ํ•˜๊ธฐ๋กœ. ์š”์ฆ˜ ์ˆ˜์—…์—์„œ ํด๋กœ์ € ์ฝ”๋“œ ์ž‘์„ฑ์ด ์žฆ์•„์ ธ์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋‚˜๋„ ํด๋กœ์ €๋ฅผ ์“ฐ๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ, ๋”ฑ ์•ก๊ธฐ์Šค ๋ฐ˜์ ˆ๋งŒ ์ดํ•ดํ•˜๊ณ  ์“ฐ๋Š” ๊ธฐ๋ถ„์ด๋ผ ์บก์ณ ๋‚ด์šฉ์„ ๋ฐฐ์šฐ๋ฉด์„œ ํด๋กœ์ €๋Š”... ์™œ... ๋‹ค ํ•ด๋‚ด์ง€? ์‹ถ์–ด์„œ ์กฐ๊ธˆ ํ˜ผ๋ž€์Šค๋Ÿฌ์› ๋‹ค. 
 
 
 
 
 
 



 

์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'๐ŸŒฑ SeSAC iOS 3๊ธฐ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๐ŸŒฑ ์ƒˆ์‹น ์˜๋“ฑํฌ iOS ์•ฑ๊ฐœ๋ฐœ์ž ๋ฐ๋ท”๊ณผ์ • 3๊ธฐ ํ›„๊ธฐ  (5) 2024.06.25
[SeSAC] iOS ๊ฐœ์ธ์•ฑ <์ง๊ด€๋กœ๊ทธ> ์ถœ์‹œ ํšŒ๊ณ   (10) 2023.10.24
๐ŸŒฑ 6์ฃผ์ฐจ: NotificationCenter, CLLocationManager, MKMapView, UIPageViewController  (1) 2023.08.27
๐ŸŒฑ 5์ฃผ์ฐจ: API ํ†ต์‹ , Codable, DispatchGroup, ๋ณต์Šต  (1) 2023.08.20
๐ŸŒฑ 4์ฃผ์ฐจ: ๋„คํŠธ์›Œํฌ ํ†ต์‹   (0) 2023.08.13
'๐ŸŒฑ SeSAC iOS 3๊ธฐ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • ๐ŸŒฑ ์ƒˆ์‹น ์˜๋“ฑํฌ iOS ์•ฑ๊ฐœ๋ฐœ์ž ๋ฐ๋ท”๊ณผ์ • 3๊ธฐ ํ›„๊ธฐ
  • [SeSAC] iOS ๊ฐœ์ธ์•ฑ <์ง๊ด€๋กœ๊ทธ> ์ถœ์‹œ ํšŒ๊ณ 
  • ๐ŸŒฑ 6์ฃผ์ฐจ: NotificationCenter, CLLocationManager, MKMapView, UIPageViewController
  • ๐ŸŒฑ 5์ฃผ์ฐจ: API ํ†ต์‹ , Codable, DispatchGroup, ๋ณต์Šต
Callie_
Callie_
  • Callie_
    CalliOS
    Callie_
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ
      • ๐ŸŽ APPLE
      • ๐ŸŽ Dev
        • Swift
        • UIKit
        • SwiftUI
        • Issue
        • ๊ตฌํ˜„
      • ๐ŸŽ Design
        • HIG
      • โš™๏ธ CS
      • ๐Ÿ’ก ์•Œ๊ณ ๋ฆฌ์ฆ˜
        • ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
        • ๋ฐฑ์ค€
      • ๐ŸŸ๏ธ ์ง๊ด€๋กœ๊ทธ (์ถœ์‹œ์•ฑ)
        • ์—…๋ฐ์ดํŠธ
      • ๐ŸŒฑ SeSAC iOS 3๊ธฐ
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    .OverFullScreen
    diffable
    assets
    Snapshot
    CustomView
    addTarget
    SeSAC
    CocoaTouchFramework
    Swift
    DiffableDataSource
    cornerradius
    layer.shadow
    apply
    Enum
    modalPresentStyle
    ๋„คํŠธ์›Œํฌํ†ต์‹ 
    ์ƒ๋ช…์ฃผ๊ธฐ
    IBAction
    TableViewCell
    stroyboard
    TapGestureRecognizer
    Infoํƒญ
    IBOutlet
    DidEndOnExit
    ios
    Entry Point
    .fullScreen
    ํ™”๋ฉด์ „ํ™˜
    clipsToBound
    SwiftUI
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
Callie_
๐ŸŒฑ 7์ฃผ์ฐจ: URLSession, Access Control, ARC
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”