๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
SeSAC

[iOS] TIL_20230811

by lizzydev 2023. 8. 15.

 

identifier ์‰ฝ๊ฒŒ ์ง€์ •ํ•˜๊ธฐ

Untitled.pngUntitled.png

๊ฐœ๋ณ„ ํด๋ž˜์Šค์— identifer ์„ ์–ธํ•˜์ง€ ์•Š์•„๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

ํ”„๋กœํ† ์ฝœ ์—†์–ด๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

Untitled.png

ํ•˜์ง€๋งŒ ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒ ํ•ด๋†“์œผ๋ฉด ์–ด๋–ค ์ด์œ ๋กœ ๊ตฌํ˜„ ๋˜์–ด์žˆ๋Š”์ง€ ๊ตฌ์กฐ๋ฅผ ํŒŒ์•… ํ•˜๊ธฐ ์ข‹์Œ.

UserDefaultsHelper

๋ฐ–์— ๋„ฃ์œผ๋ฉด ๋นŒ๋“œํ•  ๋•Œ ๋ชจ๋“  swift ํŒŒ์ผ์—์„œ ์ ‘๊ทผ๊ฐ€๋Šฅ(๋ชจ๋“ ํŒŒ์ผ์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๊ฒŒ๋” ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”)

Untitled.pngUntitled.png

ํด๋ž˜์Šค ์•ˆ์—์„œ๋งŒ ์‚ฌ์šฉํ•  enum ์ด๋ผ๋ฉด ํด๋ž˜์Šค ์•ˆ์— ๋‘๋ฉด ํด๋ž˜์Šค ์“ฐ์ผ ๋•Œ๋งŒ ์ปดํŒŒ์ผ ํ•˜๋ฉด ๋˜์–ด์„œ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์„ ์•„๋‚„ ์ˆ˜ ์žˆ์Œ. → ์ปดํŒŒ์ผ ์ตœ์ ํ™”

Untitled.png

class UserDefaultsHelper {
    let userDefaults = UserDefaults.standard
    
    enum Key: String {
        case nickname, age
    }
    
    var nickname: String {
        get {
            return userDefaults.string(forKey: Key.nickname.rawValue) ?? "๋Œ€์žฅ"
        }
        set {
            userDefaults.set(newValue,forKey: Key.nickname.rawValue)
        }
    }
    
    var age: Int {
        get {
            return userDefaults.integer(forKey: Key.age.rawValue)
        }
        set {
            userDefaults.set(newValue, forKey: Key.age.rawValue)
        }
    }
}
let helper = UserDefaultsHelper() 
UserDefaults.standard.set("๊ณ ๋ž˜๋ฐฅ", forKey: "nickname") 
UserDefaults.standard.set(33,forKey:"age")
helper.nickname = "์น™์ด‰" helper.age = 23 
originalTextView.text = UserDefaults.standard.string(forKey: "nickname") 
originalTextView.text = "\(UserDefaults.standard.integer(forKey: "age"))"
originalTextView.text = helper.nickname originalTextView.text = "\(helper.age)" 

์‹ฑ๊ธ€ํ„ด ํŒจํ„ด

Untitled.png

 

์ธ์Šคํ„ด์Šค ์—†์ด UserDefaultsHelper ์‚ฌ์šฉ ๊ฐ€๋Šฅ

Untitled.pngUntitled.png

ํ•˜์ง€๋งŒ ์•„๋ž˜ ๊ตฌ๋ฌธ์ฒ˜๋Ÿผ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์ด ๊ฐ€๋Šฅ์€ ํ•จ.

Untitled.png

์ดˆ๊ธฐํ™” ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ธฐ

Untitled.pngUntitled.pngUntitled.png

Closure

ํ•จ์ˆ˜

  • ์ด๋ฆ„์ด ์žˆ๋Š” ํ•จ์ˆ˜ : ์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ ์‚ฌ์šฉํ•œ ์ผ๋ฐ˜์ ์ธ ํ•จ์ˆ˜๋“ค
  • ์ด๋ฆ„์ด ์—†๋Š” ํ•จ์ˆ˜ : ์ต๋ช…ํ•จ์ˆ˜. closure(์ด๋ฆ„์žˆ๋Š”,์—†๋Š” ํ•จ์ˆ˜ ๋ชจ๋‘ ํด๋กœ์ ธ๋ผ๊ณ  ํ•˜๊ธฐ๋„ ํ•จ)
func studyiOS() {
    print("์ฃผ๋ง์—๋„ ๊ณต๋ถ€ํ•˜๊ธฐ")
}

let study: () -> () =  {
    print("์ฃผ๋ง์—๋„ ๊ณต๋ถ€ํ•˜๊ธฐ")
}

study()

//ํด๋กœ์ € ํ—ค๋” in ํด๋กœ์ € ๋ฐ”๋””
let studyHarder = { () -> () in
    print("์ฃผ๋ง์—๋„ ๊ณต๋ถ€ํ•˜๊ธฐ")
}

in ์•ž : closure header

in ๋’ค : closure body

//ํด๋กœ์ € ํ—ค๋” in ํด๋กœ์ € ๋ฐ”๋””
let studyHarder = { () -> () in
    print("์ฃผ๋ง์—๋„ ๊ณต๋ถ€ํ•˜๊ธฐ")
}

Untitled.pngUntitled.pngUntitled.pngUntitled.png

  • ์ธ๋ผ์ธ(inline) ํด๋กœ์ € : ์ฝ”๋“œ๋ฅผ ์ „ํ˜€ ์ƒ๋žตํ•˜์ง€ ์•Š๊ณ , ํด๋กœ์ € ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•œ ์ƒํƒœ. ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋‚ด์— ํด๋กœ์ €๊ฐ€ ๊ทธ๋Œ€๋กœ ๋“ค์–ด๊ฐ„ ํ˜•ํƒœ

ํ•จ์ˆ˜ ์•ˆ์— ํ•จ์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ„ ๋Š๋‚Œ.

ํด๋กœ์ €์— ๋Œ€ํ•œ ๊ฒฝ๋Ÿ‰ํ™” ๋ฌธ๋ฒ•

Untitled.pngUntitled.png

  • ํ•จ์ˆ˜ ๋’ค์— ํด๋กœ์ € ์‹คํ–‰
  • ํŠธ๋ ˆ์ผ๋ง(ํ›„ํ–‰) ํด๋กœ์ €

Untitled.png

๋งค๊ฐœ๋ณ€์ˆ˜ ์žˆ์–ด์•ผ ํ•จ.

Untitled.pngUntitled.pngUntitled.pngUntitled.png

→ ์ธ๋ผ์ธ ํด๋กœ์ €

Untitled.pngUntitled.pngUntitled.png

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ƒ๋žต ๋˜๋ฉด, ํ• ๋‹น๋˜์–ด ์žˆ๋Š” ๋‚ด๋ถ€์ƒ์ˆ˜ $0๋ฅผ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.

return ์ƒ๋žต

filter

์š”์†Œ๋“ค์„ ์กฐ๊ฑด์— ๋”ฐ๋ผ ํ•„ํ„ฐ๋งํ•˜์—ฌ ๊ฐ€์ ธ์˜ด.

Untitled.pngUntitled.png

map

๊ธฐ์กด ์š”์†Œ๋ฅผ ํด๋กœ์ €๋ฅผ ํ†ตํ•ด ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝ

Untitled.pngUntitled.png

API Manager

Untitled.png

๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ํ•จ์ˆ˜ ๋ฐ–์œผ๋กœ ๊บผ๋ƒ„

Untitled.pngUntitled.pngUntitled.pngUntitled.pngUntitled.pngUntitled.png

Translation API

Untitled.png

๋ฐ์ดํ„ฐ ๋ฐ”๊นฅ์œผ๋กœ ๋ณด๋‚ด์ฃผ๋Š” ๋ฐฉ๋ฒ•

Untitled.png

๋ฐ”๊นฅ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด result String ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์„ ์–ธ

Untitled.pngUntitled.png

๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ทฐ์ปจ์—๊ฒŒ ์ „๋‹ฌ

ViewController ๋ณ€๊ฒฝ ์ „

Untitled.png

ViewController ๋ณ€๊ฒฝ ํ›„

Untitled.png

์ด์ œ ๋ทฐ์ปจ์— Alamofire, SwiftyJson import ์•ˆํ•ด์ค˜๋„ ๋จ

GCD - Async/Sync

NASA ์‚ฌ์ง„ ๊ฐ€์ ธ์˜ค๊ธฐ

 

NASA Open APIs

 

api.nasa.gov

Untitled.png

์ด๋ฏธ์ง€ ๊ฐ€์ ธ์˜ค๋Š” ์ฝ”๋“œ (๊ธฐ์กด์—๋Š” ์ด ๊ณผ์ •์„ kingfisher๋กœ ํ•œ ๊ฒƒ)

let url = URL(string: "https://api.nasa.gov/assets/img/general/apod.jpg")!
let data = try! Data(contentsOf: url)
firstImageView.image = UIImage(data: data)

KakaoTalk_Photo_2023-08-11-14-30-31.png

์ด๋ฏธ์ง€ ๋ถˆ๋Ÿฌ์˜ค๋Š”๋™์•ˆ์€ ์Šค์œ„์น˜๊ฐ€ ๋™์ž‘ ์•ˆ ํ•จ.

Untitled.png

Xcode๊ฐ€ ๊ฒฝ๊ณ  ๋„์›Œ์คŒ → ๊ธฐ์กด์—๋Š” Alamofire ๋‚ด๋ถ€์—์„œ ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•ด์คฌ์Œ.

์•„๋ž˜์ฒ˜๋Ÿผ ์ฝ”๋“œ ์ˆ˜์ •

Untitled.png

@IBAction func buttonClicked(_ sender: UIButton) {
        
        let url = URL(string: "https://api.nasa.gov/assets/img/general/apod.jpg")!
        
        DispatchQueue.global().async {
            let data = try! Data(contentsOf: url)
            
            DispatchQueue.main.async {
                self.firstImageView.image = UIImage(data: data)
            }
        }
     
    }

์ด๋ฏธ์ง€ ๋‹ค์šด๋ฐ›๋Š” ๋ฒ„ํŠผ ๋ˆ„๋ฅธ ํ›„์—๋„ ์Šค์œ„์น˜ ์ž˜ ์›€์ง์ž„.

  • sync : Queue์— ๋“ค์–ด๊ฐ„ ์ž‘์—…์ด ๋๋‚  ๋•Œ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๋‹ค์Œ ์ž‘์—…ํ• ๊นŒ?
  • async : ์ž‘์—… Queue์— ๋ณด๋‚ด๋†“๊ณ  ๋ฐ”๋กœ ๋‹ค์Œ ์ž‘์—…์„ ํ• ๊นŒ?
  • serial : ์ž‘์—… ๋ถ„๋ฐฐํ•˜๊ธฐ ๊ท€์ฐฎ์€๋ฐ ๋Œ€๊ธฐ์—ด์— ์žˆ๋Š” ์ž‘์—…์„ ํ•œ ์“ฐ๋ ˆ๋“œ๋กœ ๋ชฐ์•„ ๋ฒ„๋ฆด๊นŒ?
  • concurrent : ๊ทธ๋ž˜๋„ ๋‚ด(Queue)๊ฐ€ ๋Œ€๊ธฐ์—ด์— ์žˆ๋Š” ์ž‘์—…์„ ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ์— ๊ณจ๊ณ ๋ฃจ ๋ถ„๋ฐฐํ•˜์ž.

์•Œ๋ฐ”์ƒ ๋‹ญ ์‚ฌ์ž ์†Œ ๊ฐœ

๋‹ญ์ด ํ˜ผ์ž ์ผํ•จ. ํ”„๋ผํ‘ธ์น˜๋…ธ-ํฌ๋กœํ”Œ-๋น™์ˆ˜-ํ”„๋ผํ‘ธ์น˜๋…ธ (๋™๊ธฐ,synchronous)

→ ์•ž์˜ ํƒœ์Šคํฌ๊ฐ€ ๋๋‚˜์•ผ ๊ทธ๋‹ค์Œ ํƒœ์Šคํฌ ๊ฐ€๋Šฅ

๋‹ญ: ์ผ ์ข€ ๋‚˜๋ˆ ํ•˜์ž!!

→ ์—ฌ๋Ÿฌ์ž‘์—…์„ ๋™์‹œ์— ํ•˜์ž (๋น„๋™๊ธฐ, asynchronous)

๋งค๋‹ˆ์ € ๋ถˆ๋Ÿฌ์„œ ๋งค๋‹ˆ์ €ํ•œํ…Œ ์ผ ์ข€ ๋‚˜๋ˆ ๋‹ฌ๋ผ๊ณ  ๋ถ€ํƒ (๋ˆ„๊ฐ€ ๋ฐ”์œ์ง€ ์•ˆ๋ฐ”์œ์ง€ ๋”ฐ๋ผ ๋ถ„๋ฐฐ ํ•ด๋‹ฌ๋ผํ•จ)

๋งค๋‹ˆ์ € → ํ(Queue)

๊ณจ๊ณ ๋ฃจ ์ผ์„ ๋ถ„๋ฐฐ ํ•ด์คŒ (๋™์‹œ, Concurrent)(Global)

๋งค๋‹ˆ์ €๋„ ๊ท€์ฐฎ์•„์„œ ํ•œ๋ช…ํ•œํ…Œ ๋ชฐ์•„์„œ ์ค„ ์ˆ˜ ์žˆ์Œ. ํ•˜๋‚˜์˜ ์นœ๊ตฌํ•œํ…Œ ๋งก๊น€ (์ง๋ ฌ,Serial)(Main)

Task : ์ฝ”๋“œ ํ•œ์ค„, ํ•จ์ˆ˜ ํ•˜๋‚˜, ๋„คํŠธ์›Œํฌ ๊ธฐ๋Šฅ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋“ค์ด ์ผ์˜ ๋‹จ์œ„

์ด๋ฏธ์ง€ ๋ทฐ ์›์œผ๋กœ ๋งŒ๋“ค๊ธฐ

Untitled.png

firstImageView.layer.cornerRadius = firstImageView.frame.width/2 

frame.width๋Š” storyboard ๊ธฐ์ค€์œผ๋กœ ๋จผ์ € ๊ณ„์‚ฐ ๋จ. ๊ทธ๋ž˜์„œ ์‹œ๋ฎฌ ๊ธฐ๊ธฐ๊ฐ€ ๋ญ๋ƒ์— ๋”ฐ๋ผ ์ •์›์ด ์•ˆ ๋งŒ๋“ค์–ด์งˆ ์ˆ˜๋„ ์žˆ์Œ. ์•ฝ๊ฐ„ ์ฐŒ๋ถ€๋  ์ˆ˜๋„

์•„๋ž˜ ์ฒ˜๋Ÿผ ํ•˜๋ฉด ์ •์›์œผ๋กœ ์ž˜ ๋‚˜์˜ด.

Untitled.pngUntitled.pngUntitled.png

async์•ˆ์˜ ์ฝ”๋“œ๊ฐ€ ๊ฐ€์žฅ ๋Šฆ๊ฒŒ ์‹คํ–‰ ๋˜์–ด์„œ viewDidLoad๊ฐ€ ๋๋‚œ ๋’ค์— ์ด๋ฏธ์ง€๋ทฐ ๋ ˆ์ด์•„์›ƒ์„ ์žก๊ธฐ ๋•Œ๋ฌธ์— ์ž˜ ๊ทธ๋ ค์ง€๋Š” ๊ฒƒ.

async / sync

main / global

serial / concurrent

main - serial - async

DispatchQueue.main.async

  • main: ๋‚ด๊ฐ€ ํ• ๊ฒŒ ~(๋‹ญ)
  • async: ๋‹ญ ์นœ๊ตฌ๊ฐ€ ๋งค๋‹ˆ์ €ํ•œํ…Œ ๋‚ด๊ฐ€ ํ• ๊ฑฐ์•ผ~ ํ•˜๊ณ  ๋ณด๋‚ด๋†“๊ณ  ์ž๊ธฐ๊ฑฐ ๋‹ค๋ฅธ์ผํ•˜๋‹ค๊ฐ€ ๋งค๋‹ˆ์ €ํ•œํ…Œ ๋‹ค์‹œ ๊ฐ€์ ธ์™€์„œ ์ž๊ธฐ๊ฐ€ ํ•จ.
print("HELLO")

DispatchQueue.main.async {
    for i in 1...100 {
        print(i, terminator: " ")
    }
}

for i in 1...100 {
    print(i, terminator:  " ")
}

for i in 101...200 {
    print(i, terminator: " ")
}

print("BYE")

→ DispatchQueue.main.async์— ์žˆ๋Š” ๋‚ด์šฉ์ด ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์ถœ๋ ฅ ๋จ.

DispatchQueue.global.sync

  • global: ๋‹ค๋ฅธ ์•Œ๋ฐ”ํ•œํ…Œ ๋ถ€ํƒํ• ๊ฒŒ.
  • sync : ๋‚ด ์ผ ๋‹ค ๋๋‚œ ํ›„์— ์ผํ•ด !
  • global. sync : ๋‹ญ์ด ์ผ ํ•˜๋‚˜ ๋‹ค๋ฅธ ์•Œ๋ฐ”๊ฐ€ ์ผํ•˜๋‚˜ ๋˜‘๊ฐ™์Œ → ๊ฒฐ๊ตญ์—” iOS๊ฐ€ ๋‹ญํ•œํ…Œ ์‹œํ‚ด
print("hello")

for i in 1...100 {
    DispatchQueue.global().sync {
        print(i, terminator:  " ")
    }
}

for i in 101...200 {
    print(i, terminator: " ")
}

print("bye")

๋งŽ์ด ์“ฐ๋Š” ๊ฒƒ

  • global.async
  • main.async

์•„๋ž˜ ๋‘ ๊ฐœ๋Š” ์ž˜ ์•ˆ์”€

global.sync

main.sync → ๋งค๋‹ˆ์ €ํ•œํ…Œ ๋งก๊ฒผ๋‹ค๊ฐ€ ๊ฐ€์ ธ์™”๋‹ค๊ฐ€ ๋ฌดํ•œ ๋ฃจํ”„๋กœ ๋Œ์Œ. ๋ฐ๋“œ๋ฝ๊ฐ™์€ ์ƒํƒœ

์ค‘๊ด„ํ˜ธ ์—ด๋ฆฐ ๋ฐ ๋ถ€ํ„ฐ ๋‹ซ๋Š”๋ฐ๊นŒ์ง€๊ฐ€ ํ•˜๋‚˜์˜ ํƒœ์Šคํฌ

@escaping

callRequesst๊ฐ€ ์‹คํ–‰ ๋˜๋ฉด Alamofire์—์„œ requestํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰ ๋ ๊ฒƒ (global.async ์ด๋ผ๋Š” ๋‹ค๋ฅธ ์•Œ๋ฐ”์ƒํ•œํ…Œ ์‹œํ‚ด) → callRequest๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ๋๋‚œ ํ›„์— ๊ฒฐ๊ณผ๊ฐ€ ์˜ฌ ์ˆ˜ ์žˆ์Œ

๊ทธ๋•Œ ์ด ํ•จ์ˆ˜๊ฐ€ call Request์™€ AF์˜ ํด๋กœ์ € ๋‘๊ฐœ๋ฅผ ๋šซ๊ณ  ํƒˆ์ถœํ•ด์„œ ๊ฒฐ๊ณผ ๊ฐ’ ๋ฐ˜ํ™˜ ํ•ด์•ผ ํ•จ. -> @escaping ์‚ฌ์šฉ

Untitled.png

'SeSAC' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[iOS] TIL_230810  (0) 2023.08.14
[iOS] TIL_230809  (0) 2023.08.10
[iOS] TIL_230808  (0) 2023.08.09
[iOS] TIL_230807  (0) 2023.08.09
[iOS] TIL_230804  (0) 2023.08.06