λΉλκΈ° ν¨μ νΈμΆ νλ‘μΈμ€
1. await λ‘ ν¨μλ₯Ό νΈμΆνλ©΄, ν¨μλ ν΄λΉ μ€λ λμ μ μ΄κΆμ ν¬κΈ°νκ² λλ€. 2. async μμ & κ°μ λΈλ‘ νλ¨μ μ½λλ€μ μ€λ λλ₯Ό μ‘μμ λ°λ‘ μ€νν μ μκ² λ¨. 3. μ€λ λ μ μ΄κΆμ? μμ€ν μκ²! κ·Έλ¬λ―λ‘ await λ async μμ λ μ€μΌμ₯΄ νλΌκ³ μμ€ν μκ² λΆν. 4. μμ€ν : μ°μ μμμ λ°λΌ async λ§κ³ λ€λ₯Έ μμ μ λ¨Όμ μ§νν μ μμ. (ν΄λΉ μ€λ λμμ) 5. async μμ μ μμκ° μ€λ©΄, μμ€ν μ await νκ³ μλ μμ μ μ¬κ°νκ² νκ³ , μ΄λ€ νΉμ ν μ€λ λ μ μ΄κΆμ μ£Όλ©΄μ λ―Έλ€μ§ async μμ μ΄ μ€νλλ€. (μ€νλλ μ€λ λλ κΈ°λ€λ¦¬κΈ° μ μ μ€λ λμ λ€λ₯Ό μ μμ) / μΆμ² - https://sujinnaljin.medium.com/swift-async-await-concurrency-bd7bcf34e26f
λμμ± μ½λ μμ΄λ λΉλκΈ° μ½λλ₯Ό μμ±ν μ μμμ§λ§, μ€μ²© ν΄λ‘μ λ₯Ό μ¬μ©ν΄μΌ ν΄μ κ°λ μ±μ΄ λ¨μ΄μ§κ³ μλ¬ μν©μ λμν μ μλ κ²½μ°κ° μμκΈ° λλ¬Έμ, μλ‘ λμμ± κ°λ μ λμ !
listPhotos(inGallery: "Summer Vacation") { photoNames in
let sortedNames = photoNames.sorted()
let name = sortedNames[0]
downloadPhoto(named: name) { photo in
show(photo)
}
}
async
ν€μλ μ¬μ©.async throws
μμλ‘ μμ±.try await
λ₯Ό μ¬μ©.func listPhotos(inGallery name: String) async -> [String] {
let result = // ... some asynchronous networking code ...
return result
}
await
ν€μλλ‘ μμλλ‘ μ€ννλ€κ³ νμν΄μΌ νλ€.let photoNames = await listPhotos(inGallery: "Summer Vacation")
let sortedNames = photoNames.sorted()
let name = sortedNames[0]
let photo = await downloadPhoto(named: name)
show(photo)
func listPhotos(inGallery name: String) async -> [String] {
let result = // ... some asynchronous networking code ...
return result
}
for await in
ꡬ문μΌλ‘ λ°°μ΄ μμ΄ν
νλνλλ₯Ό λΉλκΈ°λ‘ λΆλ¬μ¬ μλ μλ€.import Foundation
let handle = FileHandle.standardInput
for try await line in handle.bytes.lines {
print(line)
}
await
λ‘ ν¨μλ₯Ό νΈμΆνλ©΄, μ½λμ ν λΆλΆλ§ μ€νλ¨.await ν€μλκ° λΆμ΄μμ΄μ
// a
let firstPhoto = await downloadPhoto(named: photoNames[0])
let secondPhoto = await downloadPhoto(named: photoNames[1])
let thirdPhoto = await downloadPhoto(named: photoNames[2])
let photos = [firstPhoto, secondPhoto, thirdPhoto]
show(photos)
νμ§λ§ μ΄λ κ² async let
νλ€λ©΄?
// async ν€μλλ₯Ό λΆμ¬μ λ³μμ ν λΉνλ©΄, λμμ 3μ₯ λ°μμ¬ μ μμ.
// μ΄μ νΈμΆμ΄ μλ£λκΈΈ κΈ°λ€λ¦¬μ§ μκ³ μμν¨.
async let firstPhoto = downloadPhoto(named: photoNames[0])
async let secondPhoto = downloadPhoto(named: photoNames[1])
async let thirdPhoto = downloadPhoto(named: photoNames[2])
// λμ μ΄ λ¬Έμ₯μ μ¬μ§ 3μ₯μ μ λΆ λ°μ λ κΉμ§ κΈ°λ€λ Έλ€ μ€νν΄μΌνκΈ° λλ¬Έμ await λ₯Ό λΆμ¬μΌ ν¨.
let photos = await [firstPhoto, secondPhoto, thirdPhoto]
show(photos)
async - let
ꡬ문μ κ²½μ° μμ
3κ°λ‘ μ΄λ£¨μ΄μ Έ μλ€.Task.init(priority: operation:)
ꡬ문μ μ¬μ©ν΄μ νμ¬ νμμμμ μ€νλλ ꡬ쑰ν λμ§ μμ μμ
μ μμ±ν μ μλ€.Task.detached(priority: operation:)
ꡬ문μ μ¬μ©νλ©΄, νμ¬ νμμμ μΌλΆκ° μλ ꡬ쑰νλμ§ μμ μμ
μ μμ±ν μ μλ€.let newPhoto = // ... some photo data ...
let handle = Task {
return await add(newPhoto, toGalleryNamed: "Spring Adventures")
}
let result = await handle.value
CancellationError
μ κ°μ μλ¬ λ°μnil
λλ λΉ μ½λ μ
λ°νTask.checkCancellation()
μ ν΅ν΄ CancellationError
κ° λ°μν μκ°μ μ‘μμ μ²λ¦¬ν μ μμ.Task.isCancelled
μ κ°μ νμΈνκ³ μ½λ λ΄μμ μ²λ¦¬ν μ μμ.Task.cancel()
νΈμΆ.μμ.
await
ν€μλλ₯Ό λΆμ¬μ νΈμΆνλ€.await
λ₯Ό μμ±νμ§ μλλ€. (actor isolation)// actor ν€μλλ₯Ό μ¬μ©ν΄μ νμμλ₯Ό λμ
νκ³ , μ€κ΄νΈλ‘ μ μ.
actor TemperatureLogger {
let label: String
var measurements: [Int]
private(set) var max: Int
init(label: String, measurement: Int) {
self.label = label
self.measurements = [measurement]
self.max = measurement
}
}
extension TemperatureLogger {
// νμμ μμμ μ€ννλ ν¨μμ΄λ―λ‘, await λ₯Ό μ°μ§ μλλ€.
// μ¬λ¬ μμ
μμ λμμ μ΄ ν¨μλ₯Ό νΈμΆνλ κ²½μ°,
// νμμ λ΄ νλ‘νΌν°μ λΆλ³μ±μ΄ κΉ¨μ§λ―λ‘
// ν λ²μ νλμ μμ
λ§ μ²λ¦¬ν μ μκ² λ§λλ νμμλ₯Ό μ¬μ©νλ€.
func update(with measurement: Int) {
measurements.append(measurement)
if measurement > max {
max = measurement
}
}
}
let logger = TemperatureLogger(label: "Outdoors", measurement: 25)
print(await logger.max)
// λ€λ₯Έ μμ
μ μ½λκ° μ΄λ―Έ μνΈμμ©νκ³ μμΌλ©΄ μ κ·Όμ κΈ°λ€λ¦¬λ λμ μΌμμ μ§.
// await λ₯Ό μμ±νμ§ μμΌλ©΄ μλ¬λ₯Ό λΏλλ€.
// Prints "25"
async await
- async ν€μλλ₯Ό ν΅ν΄ μλ non-blocking μΈ Swift μ ν¨μλ₯Ό blocking μΌλ‘ λ§λ€μ΄ μ£Όλ κ².
- await ν€μλλ₯Ό ν΅ν΄ blocking ν¨μκ° λλ λ κΉμ§ κΈ°λ€λ¦¬λ κ² (λκΈ°)
- escaping closure λ₯Ό μ¬μ©ν΄μ non-block / λΉλκΈ° λ‘ μ¬μ©νλ κ²μ block / λκΈ°μΈ κ²μ²λΌ μ¬μ©.
- async ν¨μ, await ν€μλλ‘ νΈμΆ -> μ€λ λ μ μ΄κΆ μμ€ν μ κ°λ©΄μ λκΈ° -> μμ€ν μ΄ μ°μ μμμ λ°λΌ μμ -> μ°¨λ‘κ° λμμμ μμ€ν μ΄ ν΄λΉ μμ μ μ΄λ€ μ€λ λλ₯Ό μ£Όλ©΄ κ±°κΈ°μμ μ€ν.
/- Task : λΉλκΈ° μμ μ λ¨μ. μ°μ μμλ μ·¨μλ₯Ό μ μ΄νκ³ λμ μμ± κ°λ₯.
- Actor : νλμ task λ§ mutable stateμ μ κ·Όν μ μκ² νμ¬, μμ μ± ν보.
μΆμ²
https://bbiguduk.gitbook.io/swift/language-guide-1/concurrency
https://okky.kr/article/442803
https://sujinnaljin.medium.com/swift-async-await-concurrency-bd7bcf34e26f