μλ νμΈμ~
μ€λμ GCDμ λν΄μ μ 리νλ €κ³ ν©λλ€.
GCDμ κ°λ κ³Ό μ¬μ©λ², κ·Έλ¦¬κ³ μμλ₯Ό μ€μ¬μΌλ‘ μ λ¦¬ν΄ λ³΄κ² μ΅λλ€.
GCDμ κ°λ
- GCD (Grand Central Dispatch)λ CκΈ°λ°μ μ μμ€ APIλ‘ Appleμ λ€μ€ μ€λ λ νλ‘κ·Έλλ°μ μν κΈ°μ μ λλ€.
GCDλ λΉλκΈ°μ μΌλ‘ μμ μ μνν μ μλ ν(Queue)λ₯Ό μ 곡ν©λλ€.
μ΄ νλ λ°λ‘ μ ν¬κ° μκ³ μλ DispatchQueueμ λλ€.
μ΄ νλ κ°κ°μ μμ μ λ³λμ μ€λ λμμ μνλλ©° μλμ κ°μ΄ λ κ°μ§ μ’ λ₯λ‘ λλ©λλ€.
(1) Serial Queue
- νμ μΆκ°λ μμ μ ν λ²μ νλμ© μμ°¨μ μΌλ‘ μ€νλ©λλ€. λ€μ μμ μ μ΄μ μμ μ΄ λλμΌ μ€νλ©λλ€.
- main queue : UI μ λ°μ΄νΈμ κ°μ λ©μΈ μ€λ λμμ μ€νν΄μΌ νλ μμ μ μ¬μ©λ©λλ€. μ΄ νμ μμ μ μΆκ°νλ©΄, ν΄λΉ μμ μ λ©μΈ μ€λ λμμ μμ°¨μ μΌλ‘ μ€νλ©λλ€.
(2) Concurrent Queue
- νμ μΆκ°λ μμ μ λμμ λ³λ ¬μ μΌλ‘ μ€νλ©λλ€. μ΄μ μμ μ΄ μλ£λμ§ μμλ λ€μ μμ μ΄ μ€νλ μ μμ΅λλ€.
- global queue : λ³λ ¬μ μΌλ‘ μμ μ μ€ννκΈ° μν νμ λλ€. μ΄ νμ μμ μ μΆκ°νλ©΄, μμ€ν μ΄ μ¬μ© κ°λ₯ν λͺ¨λ μμμ νμ©νμ¬ μμ μ λμμ μ²λ¦¬ν©λλ€.
GCDμ μ¬μ©λ²
GCDλ₯Ό μ¬μ©νλ €λ©΄ μμ μ€λͺ νλ νμΈ DispatchQueueλ₯Ό μ¬μ©ν©λλ€.
κ·Έλ¦¬κ³ μμ μ μννλ μ½λλ₯Ό λΈλ‘μΌλ‘ μμ±νμ¬ νμ μΆκ°ν©λλ€.
μλ₯Ό λ€μ΄, Serial Queueλ₯Ό μμ±νκ³ μμ μ μΆκ°νλ μ½λλ λ€μκ³Ό κ°μ΅λλ€.
let serialQueue = DispatchQueue(label: "example")
serialQueue.async {
// μμ
μ μννλ μ½λ
}
// μ μ½λμμλ labelμ μ¬μ©νμ¬ νλ₯Ό μμ±νκ³ , async λ©μλλ₯Ό μ¬μ©νμ¬ μμ
μ μΆκ°ν©λλ€.
// async λ©μλλ μμ
μ λΉλκΈ°μ μΌλ‘ μννλ©°, μμ
μ΄ λλλ©΄ νμμ μλμΌλ‘ μ κ±°λ©λλ€.
// labelμ΄ μλ GCDμμ κΈ°λ³Έμ μΌλ‘ μ 곡νλ main queueλ₯Ό μ΄μ©νλ©΄ λ€μκ³Ό κ°μ΄ μ¬μ©ν μ μμ΅λλ€.
DispatchQueue.main.async {
// UI μ
λ°μ΄νΈ λ±μ μμ
}
Concurrent Queueλ₯Ό μμ±νκ³ μμ μ μΆκ°νλ μ½λλ λ€μκ³Ό κ°μ΅λλ€.
let concurrentQueue = DispatchQueue(label: "example", attributes: .concurrent)
concurrentQueue.async {
// μμ
μ μννλ μ½λ
}
// μ μ½λμμλ attributes λ§€κ° λ³μλ₯Ό μ¬μ©νμ¬ Concurrent Queueλ₯Ό μμ±νκ³
// async λ©μλλ₯Ό μ¬μ©νμ¬ μμ
μ μΆκ°ν©λλ€.
// λ§μ°¬κ°μ§λ‘ labelκ³Ό attributesκ° μλ global queueλ₯Ό μ¬μ©νλ©΄ λ€μκ³Ό κ°μ΄ μ¬μ©ν μ μμ΅λλ€.
DispatchQueue.global(qos: .background).async {
// λ°±κ·ΈλΌμ΄λ μμ
λ±μ μμ
}
Syncμ Async
- μμ λ΄€λ μ½λλ€μμ μ¬μ©λλ syncμ async λ©μλκ° μλλ° μ΄λ GCDμμ μμ μ μνν λ μ¬μ©νλ λ©μλμ λλ€.
Sync : νμ μμ μ λκΈ°μ μΌλ‘ μΆκ°νμ¬ ν΄λΉ μμ μ΄ μλ£λ λκΉμ§ λ€λ₯Έ μμ μ λκΈ°νκ² ν©λλ€.
Async : νμ μμ μ λΉλκΈ°μ μΌλ‘ μΆκ°νμ¬ λ€λ₯Έ μμ κ³Ό λμμ μ€νλ μ μλλ‘ ν©λλ€.
κ°λ¨νκ² μμλ₯Ό λ€μ΄λ³΄κ² μ΅λλ€.
let queue = DispatchQueue(label: "com.example.queue")
// async μμ
queue.async {
print("Start async task")
sleep(1) // 1μ΄κ° λκΈ°
print("Finish async task")
}
print("μΌνΈ")
// sync μμ
queue.sync {
print("Start sync task")
sleep(1) // 1μ΄κ° λκΈ°
print("Finish sync task")
}
print("λ§μΈ")
μμ κ°μ΄ μμ±ν μ½λμ κ²½μ°, μμμ μ€λͺ νλ κ²μ²λΌ
async λ©μλλ₯Ό μ¬μ©ν μμ μ΄ νμ μΆκ°λ μ§ν λ°λ‘ μ€νμ΄ λ κ²μ λλ€.
λ μ΄ μμ μ΄ μλ£λκΈ° μ κΉμ§ λ€λ₯Έ μμ μ κΈ°λ€λ¦΄ νμκ° μκΈ° λλ¬Έμ μΆλ ₯ μμλ λ€μκ³Ό κ°μ΅λλ€.
μΆλ ₯μμ : μΌνΈ -> Start async task -> Finish async task
μ΄μ λ€λ₯΄κ² sync λ©μλλ₯Ό μ¬μ©ν μμ μ
νμ μΆκ°λ ν ν΄λΉ μμ μ΄ μλ£λ λκΉμ§ λκΈ°ν΄μΌ νλ―λ‘ λ€λ₯Έ μμ μ΄ μνλμ§ μμ΅λλ€.
κ²°κ³Όμ μΌλ‘ λ€μκ³Ό κ°μ μμλ‘ μΆλ ₯μ΄ λ©λλ€.
μΆλ ₯μμ : Start sync task -> Finish sync task -> λ§μΈ
μ 리νλ©΄
νμ μμ μ μΆκ°ν λ async λ©μλλ₯Ό μ¬μ©νλ©΄, μμ μ νμμ λΉλκΈ°μ μΌλ‘ μ€νλ©λλ€. μμ μ΄ μλ£λλ©΄ ν΄λΉ μμ μ΄ μλ£λμλ€λ μ νΈκ° μ λ¬λμ΄, λ€μ μμ μ μ²λ¦¬ν μ μκ² λ©λλ€.
λ°λ©΄μ, sync λ©μλλ₯Ό μ¬μ©νλ©΄, νμ μμ μ΄ μΆκ°λ ν, μμ μ΄ μλ£λ λκΉμ§ λ€μ μμ μ λκΈ°ν©λλ€. μμ μ΄ μλ£λλ©΄ λ€μ μμ μ μ²λ¦¬ν©λλ€. μ΄λ κ² ν¨μΌλ‘μ¨, νμμ μ€νλλ μμ λ€μ μμ°¨μ μΌλ‘ μ€νλ μ μμ΅λλ€.
κ°λ¨ν μμ
GCDλ₯Ό μ΄μ©ν΄ λ€νΈμν¬ μμ²μ νλ μμ μ½λμ λλ€.
// λ€νΈμν¬ μμ²
func fetchImage(url: URL, completion: @escaping (UIImage?, Error?) -> Void) {
DispatchQueue.global(qos: .background).async {
do {
let data = try Data(contentsOf: url)
let image = UIImage(data: data)
completion(image, nil)
} catch {
completion(nil, error)
}
}
}
// μμ
let url = URL(string: "https://my_image.jpg")!
fetchImage(url: url) { image, error in
if let error = error {
return
}
DispatchQueue.main.async {
imageView.image = image
}
}
fetchImage ν¨μ λ΄λΆμμ global queueλ₯Ό μ¬μ©νμ¬ λ€νΈμν¬ μμ² μμ μ μ€ννκ³
μ΄ λ, main queueλ₯Ό μ¬μ©νμ¬ UI μ λ°μ΄νΈ μμ μ μ€ννλ μ½λμ λλ€.
μ€λμ μ¬κΈ°κΉμ§ μ λ¦¬ν΄ λ³΄κ² μ΅λλ€!
global queueλ₯Ό μ¬μ©ν λ, qosμ κ΄λ ¨νμ¬λ μΆνμ μ 리ν΄μ
μ΄ ν¬μ€ν μ μΆκ°ν μμ μ λλ€.
κ·ΈλΌ μ΄λ§ ππ»ππ»ππ»
'iOS > Swift' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Swift] Genericsμ λν΄μ (0) | 2023.03.09 |
---|---|
[Swift] ARC(Automatic Reference Counting)μ λν΄μ μμ보μ. (0) | 2023.03.04 |
[Swift] μ κ·μμ ν΅ν λ¬Έμμ΄ νλ¨ (0) | 2022.11.14 |
[Swift] λ¬Έμμ΄ μλ₯΄κΈ° λ° μ«μλ‘ λ°νμ΄ κ°λ₯νμ§ νμΈνκΈ° (0) | 2022.11.12 |
[Swift] UITextFieldμμ Placeholderμ μμ λ°κΎΈκΈ° (0) | 2022.11.10 |