identifier ์ฝ๊ฒ ์ง์ ํ๊ธฐ
๊ฐ๋ณ ํด๋์ค์ identifer ์ ์ธํ์ง ์์๋ ์ฌ์ฉ ๊ฐ๋ฅ
ํ๋กํ ์ฝ ์์ด๋ ์ฌ์ฉ ๊ฐ๋ฅ
ํ์ง๋ง ํ๋กํ ์ฝ์ ์ฑํ ํด๋์ผ๋ฉด ์ด๋ค ์ด์ ๋ก ๊ตฌํ ๋์ด์๋์ง ๊ตฌ์กฐ๋ฅผ ํ์ ํ๊ธฐ ์ข์.
UserDefaultsHelper
๋ฐ์ ๋ฃ์ผ๋ฉด ๋น๋ํ ๋ ๋ชจ๋ swift ํ์ผ์์ ์ ๊ทผ๊ฐ๋ฅ(๋ชจ๋ ํ์ผ์์ ์ฌ์ฉ๋ ์ ์๊ฒ๋ ์ฒ๋ฆฌ๊ฐ ํ์)
ํด๋์ค ์์์๋ง ์ฌ์ฉํ enum ์ด๋ผ๋ฉด ํด๋์ค ์์ ๋๋ฉด ํด๋์ค ์ฐ์ผ ๋๋ง ์ปดํ์ผ ํ๋ฉด ๋์ด์ ์ปดํ์ผ ์๊ฐ์ ์๋ ์ ์์. → ์ปดํ์ผ ์ต์ ํ
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)"
์ฑ๊ธํด ํจํด
์ธ์คํด์ค ์์ด UserDefaultsHelper ์ฌ์ฉ ๊ฐ๋ฅ
ํ์ง๋ง ์๋ ๊ตฌ๋ฌธ์ฒ๋ผ ์ธ์คํด์ค ์์ฑ์ด ๊ฐ๋ฅ์ ํจ.
์ด๊ธฐํ ๋ถ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ
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("์ฃผ๋ง์๋ ๊ณต๋ถํ๊ธฐ")
}
- ์ธ๋ผ์ธ(inline) ํด๋ก์ : ์ฝ๋๋ฅผ ์ ํ ์๋ตํ์ง ์๊ณ , ํด๋ก์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ํ. ํจ์์ ๋งค๊ฐ๋ณ์ ๋ด์ ํด๋ก์ ๊ฐ ๊ทธ๋๋ก ๋ค์ด๊ฐ ํํ
ํจ์ ์์ ํจ์๊ฐ ๋ค์ด๊ฐ ๋๋.
ํด๋ก์ ์ ๋ํ ๊ฒฝ๋ํ ๋ฌธ๋ฒ
- ํจ์ ๋ค์ ํด๋ก์ ์คํ
- ํธ๋ ์ผ๋ง(ํํ) ํด๋ก์
๋งค๊ฐ๋ณ์ ์์ด์ผ ํจ.
→ ์ธ๋ผ์ธ ํด๋ก์
๋งค๊ฐ๋ณ์๊ฐ ์๋ต ๋๋ฉด, ํ ๋น๋์ด ์๋ ๋ด๋ถ์์ $0๋ฅผ ์ฌ์ฉ ํ ์ ์๋ค.
return ์๋ต
filter
์์๋ค์ ์กฐ๊ฑด์ ๋ฐ๋ผ ํํฐ๋งํ์ฌ ๊ฐ์ ธ์ด.
map
๊ธฐ์กด ์์๋ฅผ ํด๋ก์ ๋ฅผ ํตํด ์ํ๋ ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ๋ณ๊ฒฝ
API Manager
๊ณตํต์ ์ผ๋ก ์ฌ์ฉํ๋ฏ๋ก ํจ์ ๋ฐ์ผ๋ก ๊บผ๋
Translation API
๋ฐ์ดํฐ ๋ฐ๊นฅ์ผ๋ก ๋ณด๋ด์ฃผ๋ ๋ฐฉ๋ฒ
๋ฐ๊นฅ์์ ์ฌ์ฉํ๊ธฐ ์ํด result String ๋งค๊ฐ๋ณ์๋ก ์ ์ธ
๋งค๊ฐ๋ณ์๋ก ๋ทฐ์ปจ์๊ฒ ์ ๋ฌ
ViewController ๋ณ๊ฒฝ ์
ViewController ๋ณ๊ฒฝ ํ
์ด์ ๋ทฐ์ปจ์ Alamofire, SwiftyJson import ์ํด์ค๋ ๋จ
GCD - Async/Sync
NASA ์ฌ์ง ๊ฐ์ ธ์ค๊ธฐ
NASA Open APIs
api.nasa.gov
์ด๋ฏธ์ง ๊ฐ์ ธ์ค๋ ์ฝ๋ (๊ธฐ์กด์๋ ์ด ๊ณผ์ ์ 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)
์ด๋ฏธ์ง ๋ถ๋ฌ์ค๋๋์์ ์ค์์น๊ฐ ๋์ ์ ํจ.
Xcode๊ฐ ๊ฒฝ๊ณ ๋์์ค → ๊ธฐ์กด์๋ Alamofire ๋ด๋ถ์์ ์์์ ์ฒ๋ฆฌํด์คฌ์.
์๋์ฒ๋ผ ์ฝ๋ ์์
@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 : ์ฝ๋ ํ์ค, ํจ์ ํ๋, ๋คํธ์ํฌ ๊ธฐ๋ฅ ํ๋์ ๋จ์๋ค์ด ์ผ์ ๋จ์
์ด๋ฏธ์ง ๋ทฐ ์์ผ๋ก ๋ง๋ค๊ธฐ
firstImageView.layer.cornerRadius = firstImageView.frame.width/2
frame.width๋ storyboard ๊ธฐ์ค์ผ๋ก ๋จผ์ ๊ณ์ฐ ๋จ. ๊ทธ๋์ ์๋ฎฌ ๊ธฐ๊ธฐ๊ฐ ๋ญ๋์ ๋ฐ๋ผ ์ ์์ด ์ ๋ง๋ค์ด์ง ์๋ ์์. ์ฝ๊ฐ ์ฐ๋ถ๋ ์๋
์๋ ์ฒ๋ผ ํ๋ฉด ์ ์์ผ๋ก ์ ๋์ด.
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 ์ฌ์ฉ
'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 |